#ServiceNow #Hacktoberfest 2021 Code Snippets: API Model Template
hello and welcome to phil goes deep and it is hacktoberfest hopefully everyone was tuned into the live code in happy hour um apologies again for the green screen it's something to do with the the lighting situation i can't figure it out so um in the interest of just trying to get myself a t-shirt and contribute something to the community i thought i would just run through the code snippets uh contribution i've been doing uh the the audio looks a little bit hello and welcome to phil goes deep and tonight or today or yesterday or this morning depending where you are i'm going to be walking through the hacktoberfest 2021 code snippets contribution i've been doing so just gonna see what i've built test it make sure it works and demonstrate how maybe you can use this in in some of your application designs yeah let's uh try and get into it so i thought i'd start with a little bit of a just a little design run through uh explain what i've been doing so um if you want to know what's going on with hacktoberfest then you know i'll share some links for servicenow community the live code and happy hour and all of that stuff but basically what i've been building is an api model so in fact i'll just show you quickly in my i've forked my repo under the script includes i've got this api model template and i've got these these files so application core application core base so everything i'm doing has got a base base is where i've got all my code and then the end points is the script include you'd actually call so if we just model this out quickly and then we'll look at a i'm going to make a use case up and talk about how you might be able to leverage this into your application design that's the plan so we've got application core example object example strategy and i should have called that example engine to be honest but we'll just call that engine from now on so application core engine example object so example object engine strategy example strategy that's probably over here with with the engine so i think that's basically what i've got we've got four there so we should have eight two four six eight excellent so each of these has got a base i'm using draw io by the way um i love this thing or drawing oh i don't know actually how you're supposed to pronounce it but durio is probably better because it's kind of like a free vizio so the idea here is um you know if you're building an application then your base apis will be where all of the code is really and if you were building a scoped app you would make these read-only and then you would extend into these apis and they won't be read only so you you will kind of invite your customers or your consumers into if you're going to modify the code modify it here as a vendor of the application you're never going to touch these right so they won't change but you would you've then got freedom to touch these and that isolates the updates and allows upgrades to be managed in a way that is uh maintainable even if stuff breaks at least you understand what has changed okay so that that's the concept here so in terms of application core this is where you can put things that are to be leveraged throughout your application so things like constants properties tables anything everything that's kind of common across your application can be defined here but these uh allow you to put certain behaviors in and things like objects right if you think about object orientated um you would instantiate this and it's called example object but in the kind of use case that i'm thinking of um this would be called i'm going to call it profile right that's the thing that that's the idea that i've got in my head so you would say new profile and everything about that object is about a profile this engine strategy model i don't know if i'm following solid principles here but you kind of call the engine the engine will then instantiate the relevant strategy so you can have if we take the profile scenario we would have a strategy for what kind of profile might we have um let's call it hacker base um dammit that'll be called hacker strategy base i don't know what another type of profile might be i haven't thought that far ahead but basically you can have let's call it hacker one hacker one and hacker two now depending on the type of profile you are the engine will instantiate that one or that one but it will call a common um kind of protocol so strategy.run that's the kind of scenario here so each of these application core each of these will extend from application core so you share all of that functionality you've got kind of common functionality across across that so you put your constants in here and then these are inherited or extended whichever way you want to look at it yo i've got i've got a couple of people tuned in say dhruv and ah please include the volume again akira i'm sorry man do you know what it is it's because i don't i'm trying to avoid the noise hopefully this happened last time man there's i'll just i can pick up a bit of noise there and i don't think that's good maybe i need a little bit of background music uh how's that akira is that better dhruv's asking me what's the target so the target is um to win a t-shirt um for hacktoberfest 2021. that's my target uh but in terms of uh what i'm going to do tonight i'm just going to show you what i've built so far so i've got three pull requests currently pending and i just need to do a fourth one but i'm doing this in the code snippet so in in code snippets if we go up to the servicenow dev program code snippets you'll find that i've already got this script includes api model template so all i'm saying here is if you're going to build an application maybe some of this stuff might be worth considering i'm just at the moment just explaining kind of how to [Music] how to use it so i'm giving you [Music] these objects put them in green i'm giving you these objects but you you wouldn't really put maybe you call application core those names don't need to change so these ones will put in blue and these ones are the things that we're actually going to build from so maybe i'll call these gray because you're basically going to replace these so you know that's going to become that for example uh how's the volume can you just give me a volume check sorry akira because i've missed the message to start with um hopefully akira's still tuned in but yeah not covering anything really grc tonight but i'm taking a lot of principles from grc with this kind of base model um and i'm just off the top of my head coming up with a use case of how to implement the things that i've built how to use the code snippets that i've built because i imagine that if somebody goes in there and goes i mean there might be a little bit of nice code but that's um basically the stuff i've put in if we flip over to your visual studio code if we look at my application core base i've got this concept of get gr now i've used this in a number of different kind of applications that i've built so get gr what's the point of that i can get a glide record well maybe i should use glide record secure here that's um maybe worth thinking about so i'm just gonna instantiate the glide record and pass an id in okay but each time i call get gr i need to specify the table name however within your application you're going to have very common places that you always call so just to give you out of the box functionality get gr user is an explicit class okay so i don't need to specify the table name here i just pass in an id so when i call get gr user i just get an id i just pass an id but my user or my table name is stored in my constants okay so what i would do up here is just create my tables and you know i'll show this basically in a minute um you put all your tables for your application up here as constants this is the application core base they're then available to all of your objects so you can just say get user right i know user is not really the right one because well gs get user gets the current user from the session but if i want to get a glide record of a specific user then i need the id so that's that's the concept here hopefully it's making sense i don't know it's quite late on a friday and i've already watched live code in happy hour and the guys on there were smashing it and i'm very interested in getting involved in some of the other repos things like instant scan for example but i just thought i've built something i should probably try and explain how to use it so the use case is a little bit flaky to be honest so in my studio i've just basically stored just created this little hacktoberfest application i've created a role i've created a menu just because in doing this what i want to show as well is when you first create a scoped app there's a little trick that's worth being aware of if you go to file settings this is your application settings okay so every time you create your own brand new scoped application you should do this the first thing you should do is create a role and then you should create a menu and then thirdly you should go into your application settings and in the menu item you should put your menu here and your user role will be these are just defaults right i'm going to use snu tools keyboard shortcuts so just in doing those two things or at least that one thing setting those two values on your application settings means that when you go and create a new table which you're going to do a lot of if you're creating a scoped app automatically it's defined the module okay and that saves it creating multiple modules and then trying to tidy them up afterwards or going and clicking i just want to avoid clicks so i'm just putting it straight into my module and then guess what in my application um in my table controls my role is automatically populated as well so that's just a little trick that you can use when you're creating scoped applications if you start off from the beginning and i use um a fairly common role model in my applications as well which again i've live i've taken the idea from grc i didn't think of this myself but it's a common approach that i think should be more common reader is inherited into user is inherited into manager is inherited into admin okay admin has access to things like all your properties reader has all the read acls on your system but user can do most of the stuff and the manager can have additional access things like permissions to ui actions to allow things to move through etc so i just start off all the time with either a user or a manager and then i scale down i'll go through all the acls at the end change all the read acls to a reader change all the deletes to admin and um allow the create and the right at the user level pretty much um you know obviously there'll be a little bit of nuance in there but just doing that up front um gives us i think a solid ground so if i was creating multiple tables i don't have to think about that and click every time so what this is going to be i'm going to call this profile now one of the other things that came out recently in a discussion i think it was on live code in happy hour is that you should not extend sis user table okay if you are going to create something that is like a user object you should create a standalone table and reference the user so i'm just taking that kind of scenario on the basis that in the out of the box code snippets that i've built you can easily instantiate a gr user so i'm just thinking profile user kind of plays to a couple of things so you know in profile well let's put in here a type okay type will be a type of probably a choice i mean you can i never know whether to do necessarily choice or string because either way you can you can fix that up but let's just call that a type type will play into our strategy okay because based on the type of the profile we're going to instantiate a different type of strategy for that profile so and that kind of choice option if you look at how that's built with the switch statement and so on that will handle that quite well and that will be a string field so let's just go into that type field setting and our choices will be hacker one value too many keyboard shortcuts hacker one hacker two it's that simple um drop down choice with none mandatory uh the other thing we're going to need so if we update that the other thing obviously we're going to need is a reference to the user so if i call this user i like to make reference fields if it depends how many types of reference you're going to have to that so you know user can be referenced in multiple places something like assigned to owner manager whatever if you think of a cmdb table it will have multiple references to this user so that kind of rule doesn't necessarily make sense but in in this scenario i'm just having a single reference to this user if if you look at the task table it's got parent i feel like parents should always reference the same class okay it should always be the same class that's not true in tasks parent references task if you're going to reference something explicitly give it an explicit reference and an explicit name that's all i'm saying so type is reference reference is going to be cis user and there's a few of them okay and we will save that and let's just go and make that mandatory how's it going drew hopefully um hopefully you're safe and well and in london i was in london a couple of times last week but i haven't managed to get down there with a little bit of free time so both times i was limited with my freedoms but at some point we're gonna catch up man definitely definitely i hope you're doing well so we've got our fields we've got our table and if we go to our menu item now what did i call it hacktoberfest yeah so just in here october profiles boom my list layout is looking a bit rubbish configure list layout type will be include user include updated created created by updated by maybe that will save now i'm just wondering i'm trying to think of a use case the difference between a hakka one and a hack or two um but if i create a new my formulas rubbish as well because i created the table and then added to it afterwards but that's fine there we go so just create a bit of data so what would be a use case for my code um so how to use the code in the first place we need to import it into the application so what we'll do we'll create a script include and sometimes i feel like studio isn't the best place to do this just purely because the number of clicks create application file that's one click then i've got a find server development two clicks scripts include three clicks create four clicks okay so i feel like that's a bit of a long way around if i did it in the platform i could go s i dash n and arnold's made that a lot easier for me so just saying what we're going to do if we import this with the existing name so we're going to take application core base so we'll paste this in and we'll take application core base and that will be read only because it's the core base save then what we'll do is take application core now if i paste that in copy that copy that that all still looks good i'm going to insert and stay let's do engine i'm just using keyboard shortcuts make sure you insert and stay don't save engine base copy now the reason i want to do oh did you see that i didn't like it no that's good sorry application call there that's fine engine bays example object this is where things are going to get interesting in a moment because these are examples and these are the things that are going to get replaced so we just need to get example object base in oops i'm using the wrong keyboard shortcuts just copy these in there and make sure we insert and stay anytime i am selecting something command and a or controlling a right select all you don't you haven't got to drag your mouse and hope just click in there command a and then command v paste over it and just insert and stay now now i've done that i'm just going to click back over here if we look in the studio i'm just going to close that down look what we've got we've got all of them set up pretty quickly didn't take long so with the right keyboard shortcuts and the right kind of workflow you can bring those into the um into your scope there's not really i don't think any way to import them in because they need to come in with the right i've set everything read only okay so now i'm going to go back through so all the end point ones let me just refresh the sometimes in studio when you open them too quickly they don't load we want the form to be fully loaded so i'm just clicking into them and double clicking to reload the form and hopefully that kicks it off i still didn't like it if you navigate away before it's loaded that's no good so i'm going to change that to none right so i only want my base to be read only i don't want my end point to be read only because i didn't insert and stay base is good yep more bass to be read only but not our end points okay so we've got our example strategy but this is one of the ones we're going to rename okay example strategy and example strategy base this will be called hacker one strategy base now when we change this here it changes that for us one two three things get changed at once so that's what i really like and if we just we can basically just grab that bit save that there and the example strategy paste that there boom one two three plus four all got updated in one go and then what we can do is go hacker to strategy insert and stay and hack a two strategy base in a certain stay boom boom boom let's just kill these down we don't need these yet application core base we are going to want because we want to put in here a new table so this will be c table profile and one of the reasons for doing this right if you always reference your tables as constants in your application should you ever need to change scope or port your code you haven't got to go through and update all your table references you just update them in one place okay and that's a lesson learned from a very painful experience i've had in the past if i go to that table and just copy the name and paste that in there okay so i've now got access to that table and i'll just call it this dot gr and if i copy this method that's no longer an example but um this will be called get gr profile and that will be called get table profile we haven't got any properties yet but if we did start to stack up some properties we can start to name them in here probably in the code i should have commented that out not sure just to show it's not in use default yeah now you know i'll just put that in there now and one call it what you want replace that you can delete these if you don't need them but in my application core now if i was to go to explore i love explore you know this if i go to hack fest in my scope and say new hacker one strategy and just instantiate that it's funny why i should see why do i not see all my no properties to display interest in interesting okay let me try something um if i say strategy dot t c for constants underscore table underscore profile hmm why so that comes through application core what's happened here ah look at that application call is not extending it's extending itself got itself in the loop okay so that should hopefully that's not like in the code application core yeah it's just with the way it replaced itself that's fine so if i just get rid of that now i shouldn't have taken that shouldn't be taking so long ah because it's fast strategy right strategy hmm still not good is it did i save this application call extends application call base we've got two application core extends application core base initialize that should be working so it's funny that undefined okay i'll tell you what we'll do we'll just debug this a second new hacker one strategy let's just hit the debugger up let's see what's happening let me just close this down because i think i've got different sessions in so let's do let's go into this level new new application core there we go okay so error converting where's that error coming from but we have got all of our constants maybe it's because of null c default now so that one's working let's go initialize application core doesn't but doesn't need it really application core let's put that in i'll tell you what i'll do i'm just going to comment that out because i'm not using that either but you can see here i've got access to all of these base elements from my application core so that's good um initialize to string where why would it be erroring on on two string that's what i don't understand i don't think that'll make any difference that space type error to string cooldown maybe i've got an error in some of my functions that i haven't actually tested yet um but let's just let's just try this out so on this profile if i copy this sys id and say vibe equals and then say app dot get get gr profile i've got my glide record okay hacker one you need to check linkedin what's going on on linkedin uh what's going on on linkedin drove let's have a look man ah yes love it i love it drew thank you man uh just give me a shout out thank you um let's let's post the link in there i'm gonna put it in your chat for you um just for banter ah is the volume all right jeeve because i know akira said this a few times and other people have said it was all right and i don't know um i can hear now in my headphones on this on this like i'm getting a bit of clipping i've got the game turned all the way up i'm getting a lot of noise so i'm not sure about that but yeah look at that so app dot get gr profile that's the point i just passed an id and i'm not passing the table in so when you've got common objects that you're working with in your application and you know what they are you don't want to have to run a glide record every time this get gr function that i've built in here in application core base just passes in the table name from from the cut i forgot i'm changing it in the studio now get gr profile we specify the table name so sweet good good man love your setup by the way um love your setup man how are you finding it how's uh how's london how's life in london you know that's a song from 1980 from the 80s um from a group called london posse london posse rodney p one of the first uh uk rappers to wrap in a uk accent and he's got well his group london posse had a song called how's life in london and i believe somewhere i've got it on vinyl i think i've got it on vinyl somewhere so one of my proud accomplishments in life it's amazing how without giving too much away drew what kind of area are you in are you north east south west or you know you don't have to answer you don't have to answer that if you don't want um be as specific as you like about you know just be mindful of your personal data get gr so i've also got this setup right so set gr and we pass in object values the thing i just want to deal with is the fact that my application core is being extended into you know if i take example object here i'm going to rename this and call this profile that looks good i'm just going to rename it i'm not even going to keep or should i insert and stay let me insert and stay keep the example clean um so that was pro file example object i'm going to call this profile base make sure it doesn't break in there you see how that changed profile base base there so it doesn't quite work every time you've got to keep an eye on it um maybe that's what's happened when i was being too quick i'm gonna insert and stay there harrow i think you might have told me that actually so for initialize in our example in our object we're going to say new profile and pass in either a current so if i go to that profile and say open record in explore i'm just going to grab that out because i want to do it in the scope on in this will be var gr profile and we don't need that right now and it will be profile equals new profile gr profile so we've got an error again two strings called on in oh mate i'm going to come for a coffee literally at the moment like we're still work from home that's our policy but um i went out to london last week i was at the cloud excellence cloud excellence award shout to automate pro they were nominated and and we had a lovely dinner and a few drinks and then on saturday i was a tottenham hotspur stadium for the joshua usac fight and that was crazy man that was crazy so yeah i didn't have there was no bandwidth either side of that to give you a shout man but um hopefully in the next few weeks sometime i'm going to be back down there maybe for some some drinks with the team and no dates are set yet but um maybe if i can if i can i'll give you a shout and um yeah we can meet up for coffee beer whatever um but i'm not working from not working from the office at the moment still i've obviously got some errors in here not sure what's going on gr record so look at this gr record is my profile so i've instantiated that so i've passed in gr profile but that is this gr record so that means within my application that's worked just not sure why it keeps throwing that um that error message let's have a look let's hit the debugger again we're on and we'll run debugger should kick in let's see where we might be getting an error so we're in profile base i've got this init function right private in it and all i'm saying here is you know your initialize is right at the top of your methods normally you want to keep that kind of tidy you don't want loads going on if you start using lots of complexity to instantiate your classes just abstract that you don't have to put it all in here you can just pass it off to another function and in your init function or however you call it you can then abstract even further right and create init sub methods so we're down here anyway if type of glide record equals object yeah man do you know what i've written this code off the kind of top of my head i did look in a couple of places just to check but i haven't tested this so the fact i've got one error is not too bad this record equals yeah that returns nicely so what's wrong with why is it getting the error i don't understand why it's throwing this error out of um error converting to string type error method two string called on it it's something some kind of i've seen that error before i can't think where it's coming from all i'm trying to do here is is give a bit of a framework so if i have got two different objects so in my in my hacker one strategy and hacker two strategy that's just let's just show these refresh in here so in my run i'm going to just in here gs dot add info message hacker strategy what would come in there probably passing the glide record so this will be let's call this as the gr profile coming in gl profile and say gs.get message hello worldly person you are a type of let's do that and then we'll pass in gr profile dot get value type then there gr profile dot get table name no get class display is it cast display name might be making that up try storing object value into a variable seems like an issue with if type of hmm i'm gonna have a look at that back in a second let's just i'm trying to think right this just looks too reusable so if i um one type i want a different message to a different type that's basically what i'm going to do so if i save that and then in the same here let's make this an unworldly person unworldly person same message and then so that's our strategy we've got our two strategies and we're saying basically on this type we're largely the same and you could have an abstract strategy that gets extended in um so what i mean by that is you could create a kind of maybe that's what i should have done abstract strategy there and what you would do is is bring these down a bit and move these up and inherit these from from your abstract strategy so you've got kind of common strategic behavior uh use case for that in grc you've got abstract indicator strategy and then you've got manual indicator basic indicator scripted indicator okay so a lot of the a lot of the core is the same but then you've got nuance behavior in here for the specifics so maybe we should have implemented something like that however we've got our strategy what we now need to do is just plug our engine in so in our engine base process this gets strategy so in our instantiation engine will be gr record i want to just yeah this is why application core base i'll put it into example object base i think this might actually belong in in core not sure you can mull around with this however you want i'm just going to copy it into our engine base that's probably easier and then copy in the init function as well template messages i wonder if it's that if no in it return that seemed to work though i think it might be maybe that that was causing problems just tidy that up we don't need to do that because we don't have any dependent behavior just pass that into this gr record to engine base this gr record when we process process this strategy get strategy will var be type equals this dot gr record dot get value type or string get value returns null if it's empty which is a bit annoying so i always throw a default and make sure it's a string i want it to be a string i've said it's a string it's going to be a string so in here we've got a switch statement and we will case this off and say case hacker one ah maybe that's why i know because i've never called the engine okay fine ignore me not that you want already so that will be hacker one will be new one strategy and then i could to return hacker to strategy i was going to get rid of the default because that can't instantiate string type blah blah blah strategy dot run boom boom boom so we're going to pass it in on new engine so it'll be engine.process and we just need another option here insert and stay and call this hacker too so in my profiles hacker one copy sys id this would be hacker 2 id and grab that one copy sys id explorer we call that profile one profile too so new engine gr profile 1 should be worldly nothing happens ah new engine dot process i didn't get an error though that's nice cannot find function just remember that off the top of my head what process is there oh engine bass bass i see this is where i was too quick i want to change things probably i didn't get an error save that yeah just watch when it auto updates some of these things and cannot find get message what have i done what have i done there that's in the strategy though it has instantiated the strategy boom boom just blow this up gs.get message what's the error cannot find function get message in object in object object line 32 that's probably where we're calling it out let it get run get that that's not right get class display name um where can i let's just create a class quickly rgr equals new glide rack i'm not really going to do this gr dot get class display value i think it's that that's what's going wrong what strategy are we in hacker strategy too i think it's that if it's not that then i have to dig a bit deeper still can't find man done let's go to the engine base and hit the process hit the debugger so we're in the process step through this string type hacker one that's good bar strategy get strategy stream type still hacker one switch we're good we're in haka one return new hacker one strategy is chicken studio like a one strategy i'm guessing that looks okay it got to the met message just returned the object now it's instantiated and then we're going to call it is out there that's not fun is it so it's hitting return strategy dot run hacker one strategy like a one strategy don't run does not like gs dot get message let me just test this let me just test this function here seems to be where this is going wrong okay that's some sort of some sort of scope privilege issue still getting this error message why why it's doing the same thing gr ah i think i know what it is we're coming in here gr profile initialize i'm not passing it into run damn it in the initialize in here i haven't done anything with it so this dot gr profile equals to your profile right and then that's what it is i think that's what it is that's where an abstract strategy would be useful because you might instantiate all your strategies exactly the same way yeah this one doesn't even get initialized there obviously i'm rushing this through and i don't really have a use case um to be honest just trying to make something all right still still not working not happy about that process i'm not passing it into the strategy that's what it is okay so in my engine in here i'm not passing in this in it boom boom boom this dot gr record that's why there and now right last go or not we'll keep going probably if it don't work i still don't work come on it's gotta be what it is did i save it put a debugger back on i feel like developers are like gamblers you know one more go just one more just one more so we've got a hacker on there the type's good this dot gr record is we can't see it in should see it in here gr once we enter here it doesn't like it return new boom boom boom i don't know why it doesn't like that man i can't believe i've contributed something to the oktoberfest that's not actually working it's there or there abouts that is good why is that being a problem let's see what we'll do we'll call this here just for debugging purposes this dot gr record and make sure that that's going in nicely because that's the only thing with the debugger you can't see stuff on the prototype my gr record it's legit not until i hit run it just cashes out okay i had this recently when i was trying to do a try catch and try catch was was catching me out so let's comment that and comment that i didn't click the wrong thing makes me try catch on let's just see if it's try catch if i might be didn't try catch wrong ah that's what it is the get message oh man that error message cannot find function get message in object it's because i've got to get like it's that it's get message there cannot find function run in object that's fine now we can cope with not being able to find function run that's nice that you click that and you get the error thanks james line 30. where did we go oh we opened up the net yeah yeah 930 strategy.run come off it in the strategy with their function oh my neck started to hurt hey look at this it's the bloody swearing don't swear on tv it's this isn't it it's caught me out again ah it's caught me out again it's those name replaces i don't know but that's only hacker strategy two hacker strategy one no he's done it here man okay so you've gotta watch that when we place i was just very careless there wasted a lot of time on on something if i just took a few more moments there we go jesus right so new engine excuse me new engine gr profile one was hello worldly person hello unworldly person so basically whatever you pass into your engine process it will handle it differently based on the strategy that's the idea um i haven't brought this abstract strategy into it um you know that's that's basically it that's what i've built um let me know what you think um thanks for tuning in i know there's been a few people getting involved um drew if you're an absolute legend for joining um you're also a legend for sharing it and yeah google hall of famer man i've got a google hall of famer live on live on the show um drew if you're if you're up for it um jump on a zoom quickly and just come and say hello i mean it's up to you mate let me know if you're up for it and i'll ping you a little zoom id or something come see me what you think what else can we do yeah i think abstract strategy is not a bad idea to introduce just save that documentation i choose to go on the juice gonna bed yeah so think about different use cases you could you could apply this to um in the code snippets i'm going to share this git repo what else should i share on the um on here how to use the api model code snippets um sn devs dot no sn links dot com forward slash octoberfest 2021 i can't remember the url the short url oh rubbish aren't i just saved that quickly yeah ma'am let's wrap it up it's late here well thanks to everyone for tuning in tonight or this morning or if you're watching it back hopefully this is useful just to let you know how to use the thing that i was thinking about building it's not perfect but it might get you started it might give you an idea if you're about to build an application and even if you only need some central functions constants and properties etc you can just use the core bit if you are and i'd imagine that you are always going to have some kind of object functionality um you know you should consider building that in notice that one thing i didn't put into my um script includes there was any kind of utils effectively i think the utils is in the application core although i'm not saying there's no no space for utils but it should be the kind of i don't know where they fit in i don't know utils i'm not totally against them but um they shouldn't be the answer to everything you've got the engine and the strategy any kind of developer out there that knows their stuff more than i do please tell me if i'm doing something wrong there i'm making it up as i go along basically it's not because i studied computer science and i'm telling people that's how to do a strategy pattern i have seen it implemented and i thought that's nice i could do the same thing that does apply so happy to take feedback on anything that you've seen and even better go to hacktoberfest go to developer.servicenow.com go to the blogs check out the hacktoberfest pages sign up and get contributing to the repo and if you think there's something that's not right in there or you've got some ideas then just get in there contribute if you do four pull requests in the month of october you could win a t-shirt which comes with some serious bragging rights okay i think it's late enough we've done enough tonight i'm very happy with the progress made so far got a couple of little things to fix but next next kind of pull request i might try and do an instant scan contribution and syntax macros as well and maybe we'll do a live stream on syntax macros because i think that's something that's uh that's worth watching any final shouts anything to plug yeah take care stay safe thank you you
https://www.youtube.com/watch?v=GZYLRf3KGes