Thank you very much. I'm appreciative of the opportunity to comment. I also appreciate Maureen and Wendy having put their slides together well in advance. I put my couple of slides together this afternoon as we were listening to them. And so these are just a couple of the points that I wanted to emphasize. And I think that we all know in our own minds what LC refers to. There's actually been relatively little work in Emerge on the legal issues. Very little comment about it today. Some of us may appreciate that, but others probably see major opportunities going forward. And so I would just highlight the fact that that has been a relative desert. I also have always felt that economics belongs in LC, not just because it begins with E, but that it is a science, albeit the dismal science. But nonetheless, there is room for much formal investigation as to how economic issues impact virtually everything that we've been discussing and will discuss today. We need to involve the stakeholders, obviously. Payers and administrators have been mentioned. But even beyond that, I think they will respond best to accurate, valid data that the Emerge network itself could begin to generate formally. And so that would be one important, I think, recommendation going forward. There was an RFA not too long ago that began to address some of these issues, but there's clearly much more that could be done. As Eric Green emphasized this morning, there are a number of consortia that are addressing a number of aspects of genomic medicine. And most of them involve an LC component by necessity. Certainly point to the CSER projects and Ignite. And of course, there are the LC CSERS that have been in existence for going on a decade now. Many of us have been working in these areas independent of Emerge. And I think it would be very useful if there were some mechanism for bringing those of us working on LC issues together to discuss what we've all been finding. Whether this is the annual gathering of the CSERS or some other forum, it might be useful to ensure that we're not reinventing the wheel, as it were, to have dedicated discussions, opportunities for discussion around some of these issues. I noted in both Maureen's and Wendy's comments and in the title of this particular session that the notion of education and governance were subsumed by LC. I think that's fine. We've certainly heard some ideas about who to educate and about what. IRBs are the low-hanging fruit I would maintain. And certainly providers are important. And here the ISCC effort, a number of people on this webinar are involved in ISCC, is another forum that is actively engaged. And certainly anything that's being done through Emerge should make use of what ISCC and other groups are contemplating and testing in the realm of education. And I think NHGRI generally needs to be applauded for their work in public education, in particular the Smithsonian exhibition. But there's clearly more that needs to be done in this regard. Can we have the final slide, please? So one issue that hasn't been discussed but I think falls into the general realm of LC-related activities is the generation of policy. And we have to ask ourselves how important policy is for effective implementation of any of the recommendations coming out of Emerge or any of the other genomic medicine consortia that are actively engaged at this point in time. I would suggest that policy can be very helpful. It can also be a flash point as the ACMG recommendations on return, mandatory return of incidental findings emphasizes. But nonetheless, I think we need to consider whether developing or at least recommending policy is an important activity that could be done by the Emerge consortium. A particular area and I'll end on this note of interest to me is a whole notion of the duty to re-contact when we're smarter. Clearly, interpretations change. Heidi has presented an example of how from the laboratory perspective this can be implemented. But I'm also concerned from a number of other perspectives, particularly the clinicians perspective of what are our responsibilities to get back to patients when we do change the interpretation of something we counseled them about at some point in the past. So those are my thoughts. I'm very interested in what our other panelists, Laura Besko, Ingrid Holm, Kathy McCarty and Tracy Trotter, most of whom have identified themselves as being online have to contribute. So I'll first ask Laura to comment. Great. This is Laura Besko at Duke. Hopefully you all can hear me. I'm an associate professor and the Duke Clinical Research Institute, and I have had the pleasure of actually working as sort of an external person with a couple of different of the LC projects in Emerge and have found those both fun and beneficial. You know, a combination that I very much appreciate. So it's been great and a lot of good work being done that I look forward to continuing. I'm also a member of the Regulatory and Ethics Corps of the NIH Healthcare Systems Research Collaboratory, and I was quite struck this morning with the discussion about EHR phenotyping and, you know, moving into implementation and sort of the area between quality improvement and research and so on. Just the real synergies between Emerge and the NIH Collaboratory that I'm really wondering if there are ways to more explicitly collaborate in some way. The NIH Collaboratory already has relationships, for example, with PCORI, certain ways that we interact with CTSA on some projects. And so it really, I think there could be some really good interactions with Emerge as well. Many of the comments I had an opportunity to see the slides, and so many of the comments I had were already incorporated, and so I'll just make a few additional comments. I think that the sort of LC component of Emerge has really done such a fantastic job in terms of incorporating an ethics perspective throughout a lot of its different teams and has done a lot of really good work on soliciting stakeholder input, whether that's through descriptive sort of research, community consultation, and so on. And so those are very important foundational efforts. And I think in Emerge III, what I would personally love to see is very focused effort on building on that sort of exploratory descriptive work to actually develop and test interventions designed to address some of these ethical issues. So for example, in the area of consent, obviously a lot of work in the model language, and that's continuing, it sounds like with the pediatric language, and I think that's fantastic language. But I think it would also be interesting to actually then go ahead and test that language, try to find out about the uptake with that language, see how participants react to it, find ways to assess comprehension, and improve comprehension. So building on that initial work to actually test and see what sort of an effect in ways that things can be improved. On the regulatory front, my ears perked up this morning with the talk of the Emerge sites coming together on the data sharing agreement. And I really wondered if there was a way that Emerge could also demonstrate that sort of interaction on the IRB front and find ways, whether it's a central IRB model or some collaborative IRB model, to really demonstrate sort of a streamlined way that different institutions could work together and sort of get through some of those IRB issues. That would be great to see. With the EHR phenotyping, I think that that presents a lot of very interesting ethical issues. One that I think was alluded to this morning a bit was the idea of if you find folks with a particular genotype of interest, possibly a rare gene variant, that the idea of being able to contact them and do more in-depth phenotyping. That is a topic that I personally have done some work on. David Goldstein and I had a paper a couple of years ago where we talked about what happened at Duke when we tried that, erased some interesting issues. And so to me, that's an example of where some descriptive work has been done. And so finding out, exploring that in more robust detail, including coming up with interventions on good ways to do that sort of thing and being able to really make use of the combination of EHR data as well as genomic data. So I'll just conclude by saying I really would hope that eMERGE could become a showcase of robust empirical bioethics, similar to the way that eMERGE has been really a great resource in terms of creating large sample sizes across the different sites. I think that same benefit could apply to bioethics research. I think some of the limitations in some work today has been things like small sample sizes and so on. And so with the expertise that eMERGE has as well as being able to work collaboratively across all the sites, I think that really gathering data to address some of these ethical issues is an important contribution that eMERGE could make. So I'll stop there. Thank you very much. Is Ingrid Holm on the conference? Physically. Yes. So yeah, this is Ingrid. So my comment I think part of it is that Maureen and I were working together and kind of put some of this also talk together. And I really appreciate everybody's input, particularly that Reid and Laura were perspective on it. I think from my perspective I feel like that what our group can do at this point kind of going forward in eMERGE is probably on the education piece of it. And I think the idea of educating IRBs in particular is crucial. And just as an example, Maureen and I are now dealing with developing the survey across all the sites and we've had IRB issues already across the sites and it's been rather challenging. So I think and I sit on my IRB and I'm always educated. So I think that one of the things that we can do as a group is try to educate IRBs. I also think that eMERGE too is kind of all of has been really bad kind of genomic medicine and integrating genomics into the EHR into clinical care. And I think to me like going the next step in terms of how physicians being involved in how that information is used and particularly from kind of a patient perspective and using patient portal and just I guess kind of in general how and this is one of the comments that Maureen made too is that how people are taking this information, how they use it and kind of how they feel about it. It seems to me that that's kind of going the next step beyond getting the medical record and looking at real kind of clinical support or decision making in terms of PGX going kind of far further on with that. And a number of people have mentioned the fact that I think these patient portals may give us the opportunity to kind of do that. And I really like what Laura was saying about this idea of not just kind of developing policies and developing consensus really testing them. So for example testing consent forms and seeing how kind of getting feedback from participants in terms of using things like consent forms. So I think as we are in right now in our third group getting feedback from participants about how they feel about broad consent, we can do I think an emergency get more information back from participants about how they view genomic data that they're getting, how they view the consent forms that we're talking. So really trying to get out in the community and looking at the kind of patient stakeholders or participant stakeholders I think would be a kind of a good next step from our perspective for eMERGE. Thank you very much. Kathy McCarty? Yes, I'm here as well and some of our previous speakers I had sent my comments to so many of them have already been addressed as well. So Laura mentioned potential collaborations with the Collaboratory and how the Collaboratory has ensured collaborations with the Corey. And it strikes me that so much of what we've done already is very well aligned with what PCORI is doing, their initiatives and the methodology around including and engaging our patients as truly as partners. And what can we do to more formally work with PCORI? I think it would be something to explore. We've talked in the past about how do we engage payers. That's very important. We're doing an AMD, make the degeneration genomic medicine pilot here at Ascensia. And one of our questions as we're following up with participants is to see whether or not they would be willing to pay for genetic costs out of pocket. And that's been interesting. Some of them yes and varying costs but almost all of them would want to talk to their payers about whether or not they would cover genetic tests before having them. So how do we try to actively engage them? And I know for myself I've shown that challenging when I was at Marshall Clinic in Wisconsin. It contacted the statewide organization of HMOs and just found it challenging for them to even identify somebody to come and sit on a panel with us. So we're just concerned about doing that. How can we try to engage them as part of the community to engage? IRB education is also really important. So I have a new hat here at Ascensia. I've taken on the role of the IRB chair so I can see some little bit on that behalf. And none of the sites within the eMERGE network are part of the HMO research network. And there's currently a document going around about feeding and having essential IRBs in the HMO and how much it's supposed to be. And I think by the end of this month it will be interesting to see what we get because we have almost always have some changes to that document every time it goes through any of the legal departments. And so we need to remember to engage our legal counsel early on in the process. I don't want to look at that. And then Barbara Keenig has been our voice all along and I want to bring her voice back again. When we're educating the IRB, how do we educate them about the importance of the engagement of the community and incorporating their feedback into our IRB applications? Really important. So that we can develop, potentially have some best practices for IRBs. I think it's an absolutely great contribution to the wider community. Thank you very much. And finally, Tracy Trotter. Great. Thank you. I think about a month ago I was traded to the panel 7 pediatric team for an expert to be named later. But I saw a couple of comments. Because you called on me. One is the overall comment as a pediatrician is all the LC and consent issues of course become more complex when dealing with pediatric patients and possibly even more complex when we get into newborns and sequencing and things like that. So I look forward to the model language. I think it's important that we get as many people on the same train as we can on this thing. And I look forward to somebody coming up with good answers about updating new information and updating information as it changes over the lifespan because when your patient's four months old, when the information's gathered, you've got a lot of time to think about that and how to do it correctly and how to do it well. And I'll save the rest for my own panel. Thank you. Great. So I think it's time now to open it up to general discussion. Mark Williams again. So I just wanted to come back to the E that you posed, Reid. For those of you that were paying attention to the sidebar discussion earlier, there was a fair amount of back and forth about the role of adding a component of Emerge 3 to look at economic or value-based propositions and proposals and how to study that. Clearly that would be something that is of interest related to implementation. And we do have precedent in that the newborn sequencing RFA that was referenced did explicitly allow for an economic study to be a component of Subproject 3, which was the LC. And to my knowledge, I was the first one that specifically called that out. Clearly, there would be methodologic issues that would arise much as had been encountered related to variability in IRB, variability in phenotyping, et cetera. But in some sense, if we could develop a model across the network of doing this type of economic analysis, not only would that be valuable for the implementation of public medicine, but I think it would provide some methods for shared economic research that would be broadly applicable. So I would endorse a consideration of an economic arm to Emerge 3. Can I pipe in also on reason for judging at Susan Wolf of a more robust legal component? I think that's really critical because successful integration of genomics into clinical care requires supportive law. And conversely, if institutional leaders perceive or misperceive a legal barrier, that may stop the train in its tracks. So if you were thinking of a short list of high-impact legal flow size, it would include the clear issue we've already discussed, the HIPAA implications, because as soon as you talk about reaching out to family and even posthumous, use of posthumous information, HIPAA doesn't die when a person dies, and so that's a big set of problems. The recontact issue that was already raised, return of results itself raises a lot of legal issues, including rights to refuse, and whether you do need consent for incorporation to the electronic health record. I loved Heidi's idea. I think it was Heidi about mapping responsibilities within the EHR environment that has a lot of legal pieces to it, including from the biorepository. And lastly, you know, the advance notice of proposed rulemaking is a proposed regulatory change. So it's both ethics and law. So there's a great and really important list, I think, on the legal front. Thanks, Alan. I guess I'll echo both what Mark and Alan both said, that I think both the economics and the legal pieces are important, and I just expand on the economic piece that people have proposed population genetics and genetic screening for BRCA mutations and for limb syndrome mutations. Israel is already doing population screening for BRCA mutations, and since we have mostly population-based samples, we could really speak to the economics of screening and down-the-road costs. The other interesting aspect of an economic study is that genomic data is different from other health care data in that it is persistent. So if you think about an initial investment in genotyping, that information can then be reused over an extensive period of time based on different clinical contexts, and that's a very different type of economic assessment of an investment. I'm just not aware of anything else in health care that has that type of persistence, which I think would be very interesting to study. On the IRB front, one interesting connection is that among the NIH BD2K workshops was one that I was able to co-chair in September on the research uses of clinical data, and for the entire workshop, Jerry Manikoff, who was the director of OHRP, was present and engaged, and one of the observations he made was that delegation models are very familiar, and IRB uses a central IRB or delegates to some other member of a consortium, and his personal view was that resulted in no education. The IRB was no better for the next project they reviewed if they delegated, and he was very interested in OHRP actually supporting and engaging in some experiments of IRB consultation and education with one another that might improve the performance of the network in a persistent way. So that was OHRP inviting, I thought, organizations like eMERGE to say, let's do some interesting experiments of IRB that are not just like business as usual of delegation or central IRBs. One related aspect is the rather, I think, overly legalistic format of most consent documents, and from my point of view, they impede the consent process, and I know Mike Gaziano is out there someplace, but a project that he did before the MVP at the VA was instituted or was to pilot a brochure with information about the study versus the formal consent document that had the same information, and participants strongly preferred the brochure, which probably none of us would be surprised at, but I'm unaware of many studies of that nature, and so I think as part of educating the IRB, I don't think we're going to change CFR 36 quickly, but we might work towards a better, getting a document that was actually more user-friendly and actually communicate with what we wanted. Yeah, we should just... I wanted to make a couple of quick comments here. In large measure to support much of what was said by the panel, but people have called for a formal evaluation of the efficacy and impact of the recommendations that are coming out of the work groups, and I very much support that notion, but those types of studies, of course, are fairly expensive, so I'm wondering whether the Emerge Network can support that type of outcome study or whether this is something we need to look to with NCRI for an RFA targeted to a particular domain in that respect. And then let me ask the second question quickly, and then I'll get off. There's the people who talked, and they very much support the notion of IRBs as key stakeholders for the network here, so I think that's just a wonderful idea. So has there been any collaboration between Emerge Institution, IRBs, and support of the network today? I mean, there's been a lot of consultation at the individual level, and also a large study across IRBs in the country that several of the sites collaborated on with the GRIP consortia, so while you're suggesting the incorporation of IRBs along with some of our studies, I don't think that has been done, but certainly there has been consultation and work with IRBs in the network at most of the sites individually. I think the other elephants in the room in this area is the CTSA consortium. We are all affiliated with CTSAs, and one of the three must-dos this year for the CTSA consortium is widespread IRB reliance agreements. So that is going to completely change the IRB landscape across the CTSA for the next 12 months. Jeff, I wonder, this is Harry. I wasn't quite sure you said that would Emerge be able to support that kind of outcome study in terms of formal evaluations of many of these recommendations. It sounds like a lot of these recommendations are things like you can study the impact or the outcome or the attitudes or that sort of thing. It's not like a huge outcome study to me, but maybe I misunderstood what you were suggesting. No, I think that's exactly what I'm suggesting and as sorts come forward, but what they think would be more appropriate consent language and formats for conducting this kind of research. I think those sorts of recommendations are quite welcome, but that's different than actually evaluating their impact in terms of people's understanding of key elements of the consent process and their response to the information, et cetera. It may well be that that sort of thing, just in the flow of research participants through Emerge, you can look at some of those outcomes relatively inexpensively. What I know is we try to set up studies to formally evaluate different approaches to consent. It turns out to be complicated in a relatively expensive process in certain circumstances. So this question was, can you adequately build on the Emerge network with some supplemental funds to get that kind of work done or do you really need a separate allocation of funds to do that in a rigorous way? Right, and I guess the how we go about this is maybe a little bit down the road. We're kind of trying to define the what at the meeting today, but I think just to address the how or the who, one might also say not all of these questions are uniquely addressable in Emerge and so there might be other consortia groups that we could look at to answer them. But I think rather than getting into that, let's try and focus on the what and I think we do have to move on. Yeah, we're right on time. But Terry, I think the how is something we should be thinking about and hence my suggestion that all these different groups that are thinking about the same things need to get together and chat. Excellent point. Okay, and an excellent discussion on a topic which segues directly to actually we have another presenter in the room here in Bethesda, so Istakar will be the Emerge presenter for the topic of return of results.


I just did a presentation before this. I am not talking again. But I like being in front of a microphone as you probably can tell. So I'm going to introduce, even though he's also going to introduce himself afterwards, I'll spoiler, a good friend of mine, symphony core contributor, probably like the number two symphony guy. So if you need something done in symphony, if you don't like something in symphony, if you guys barricade the doors after the talk, you can sort of force him to do whatever you want. He's also probably one of the smartest developers I've met. I'm really lucky that we have him in the symphony community. He does the stuff that I can't figure out how to do. And then I do the easy stuff like documentation. So, yeah. So here is Nicholas Grecus and I'll leave it to him. Thank you, Ryan. So my name is Nicolas Grecus. I'm symphony core team member since two years. I work also for Blackfyre as a CTO. And I do open source since years. So maybe you know J-Squiz, which is a JavaScript minifier I wrote in 2003. Patchwork, UTF-8 also, which is now today renamed, embedded in a new project, which is symphony polyfill, that provides many polyfills for PHP. I'm also known by my co-workers as someone who writes some cryptic code. So an example is here. It's Unicode, so patchwork UTF-8. Unicode mixed with PHP. As you can see, it's able in PHP to write single character variables using combining Unicode characters. So this is a dollar with a combining car. It's legal PHP. You can run it for fun. So quickly, this is a screenshot of Blackfyre. Blackfyre is a profiler. And that's the only thing I'll tell you about Blackfyre. It's not a topic today. Today we're going to talk about debugging fluency. The goal today is to import you into using tools so that you won't get this white page again and so that you can know how to get out of this white page. So the fatal error and any other nightmare debugging you might end up into. So what is debugging? Why dumping is linked to debugging, of course. The first thing is we need tools for fixing trivial errors. Trivial means that can be detected by the PHP engine. That's a trivial error. Then when PHP says that everything is right, you have a behavior that might be wrong. And very often it's not right at the first version. So you need tools to figure out what's the behavior and how to fix it. And of course, this starts with understanding what's going on, which means representing states, because we deal with states. In the first part, I'd like to remind you how PHP works and how errors work in PHP. So errors in PHP have several levels. One is the warning level, the notice level, and deprecation. These are kind of notices. I'm sure you already saw many of them some undefined index, some F open with the permission file system issue. These are not important issues that allow, they don't break the PHP engine. You just get a notice and you can continue. But usually it may be an issue that you have to fix. And PHP is telling there might be something wrong. Then we have an intermediate level, which are the user errors and the recoverable errors. I'll tell you just after why they are special. Then we have the fatal errors. So the path error, you know that, I'm sure. The undefined function and undefined class, undefined method. So whenever you have typo, you miss some use statement at the beginning of your file. Type error, so type error is when you call a function with an array, but the function is expecting some object. You get this kind of fatal error. And the last one is the most horrible one. It's the out of memory error. And in this case, it's really, really hard to debug things. And et cetera, because I'm sure you'll find many ways to trigger bugs there. So PHP triggers this kind of errors. And PHP gives you, gives us a hook, which is set error handler with a callback. If you register a callback using this function, you will get the callback called whenever any of this function of these notices are triggered. Any of these means the first two, warnings, notices, deprecation, user errors, and recoverable errors. These are the only kind of errors that you can catch with the set error handler in PHP. And it's really useful because you can just plug what you want at this place. So what people do usually, what Drupal do, what symphony does is logging. Because after that, you can just read the log file and say, okay, I have something to fix. The function is also able to sniff, to read the error reporting level at the current moment of the call, triggering the call time. This means that you can detect and the callback can detect whenever a function is called and a trigger, a notice is triggered using the silencing operator. So you know maybe you've read about this at a thing, which changes locally the error reporting level to zero. So if you call error reporting into the callback function, you can read its return value, which if it's zero, most function, most callback, just ignore and return right now. But when it's not zero, it means it's not silent, so you can do something with that. At least the developer wants something to, wants to know about that. User errors and recoverable errors are fatal when you do not plug a custom error handler. So that's the behavior of PHP. But if you plug one, you can do something else. Then we have the other kind of errors, the fatal errors. And PHP allows us also to have some information. But then code against coaching this, so pass errors, undefined class, type errors out of memory situation, trigger the end of the PHP engine. And by the end of the PHP engine, it means PHP goes straight to the shutdown function. So we still have user-learn code that can be run at this stage. And whenever you register shutdown functions from callback, this callback will be called if a fatal error is happening during your script execution. Of course, you can do many things in shutdown functions, cleaning many things. But it's also a hack. And it's really great that PHP is so hackable that you can get fatal errors and still deal with them and do something. So typically what this kind of callback should and callback do is calling error get last, which is a function that returns an array that contains the error message, the line, and the level of the last error. In this case, it's, of course, the fatal error. Then we have another kind of error, which are exceptions. Of course, exceptions have a very different handling mechanism, and it's the try-catch block. So try, catch some exception, and do something with that. Usually user-learn code deal with them if they are expecting and if they are able to deal with not, usually not every exception, I mean the slash exception in the root namespace. But usually libraries deal with their own namespace of exceptions and are able to catch and deal with them properly. Whenever a try-catch block is missing or a try-catch block is not catching some kind of exception, and whenever this exception pops up to the root, so out of the call stack, some exception handler can be called, and it has to be registered before that with set exception handler. So it's kind of set error handler, but in this case, it's a callback that will be called whenever an exception is triggered and is not caught. So, of course, the signature of this callback is just a function that takes one argument, which is the exception. With PHP 7, we have a new kind of exceptions which are throwables and errors. So it's a new kind of object, and throwable is an interface, and error is a class, and exception, the class, is an instance of implements the throwable exception, error implements also the throwable exception, but an error is not an exception, which means that code that used the previous one, this kind of code, won't catch the error. The error will get out of the try-catch block and pop, and if you don't deal with them, and most code do not deal with them because most code are not PHP 7 aware, then the error will get up to the exception handler. This time it's the same callback, so the same callback will be called both for errors and exception, at least it could be renamed set throwable handler, but because of backward compatibility concern, they did not do that. Some code used to have a type int on the exception argument of the callback, of course PHP 7 broke that, because if you type in with backslash exception, and you get an error there, you'll get a fatal error. Okay, so another kind of error, and now we are in the daily process. I'm sure daily, maybe not daily, but very often, at least for me, we do typos, and we do character case mistakes, so when you write your class name, you miss the uppercase C, the uppercase first letter. So these are usual errors that can be worked with in the auto loader. So for that, a trick we use, and I will present you, is to decorate all auto loader, all functions that load your classes, and by decorating them, we can add checks and checks that verify that everything is good and I'll show you. You'll see. An example is this one. So the last one is you can get a message saying calling, you're calling undefined method foo. And by looking at the message, you can know that the class is bar. So the message says calling undefined method bar on class, commit of foo in class bar. And in this case, we can hook into this and say, okay, let's inspect by reflection the bar class and look at all the existing method and by Levenstein distance say, okay, this must be a typo and the likely good method is this one. And then you can have very user friendly error message suggesting the correct version of the method in this case. So that's for general error lifecycle in PHP. Now, let's see quickly what happens in let's start with Drupal. So in Drupal, by default, notices PHP notices and PHP warnings are just logged. The error handler and the exception handler, if you look at their implementation, they just call the logger that is inside of Drupal. So by looking at the log, you'll see just the error and the notices warning that happened. And code exception trigger the kernel exception event. So this means that the core of Drupal, in fact, the core of the symphony kernel has a try catch block and the try catch catches exceptions. And this exception is forwarded to an exception to the event dispatcher and the event dispatcher triggers this kernel exception event. And I think the default is to cast the exception to a string. So just displaying its message and the stack trace and then return a response with this body content.  In symphony, as so also in Drupal, the PHP 7 error throwables are not caught by codes by the kernel class. It's not, we don't deal with them in symphony. So they end up calling the set exception handler callback. And the default one is calling the logger. Same as before. In symphony, we have kind of different defaults. Notices and warnings are converted to exceptions. This means that if you use some undefined variable in your symphony code, you'll get an exception. So you will have to fix it to continue developing your controller or anything. In Drupal, it's not the case. And so it means you kind of have undefined index and defined variables, things like that. And PHP can deal with that. And it won't tell you anything except in the log. And execution will continue. So that's another way to develop. And code exception trigger the kernel exception event that the same wiring system. PHP 7 errors, same thing. And there's difference because whenever some code exceptions end up in the error handler, in the exception handler, then they are re-injected into the kernel, which is something Drupal does not right now. But by having this, we are able in symphony to take fatal errors and deal with them as if they were exceptions. Which is really useful because we can then reuse all the nice displaying tools that we have for exceptions. Tools and logging. And we have about logging, we have another option, which is to log all errors, even the silenced one. Because it's really useful to know what's happening just in your application. And just because some developer added an at scene before some F open call or something like that, doesn't mean that there is anything to look at there. And maybe the bug you're looking for is just silenced by that. So what we do is we log it. Of course we can't trigger an exception. We don't want to break the code at this stage. But if you look at those logs, you can have more information and you have full information, in fact, with these settings. Okay, so symphony, as you know, has several components. One of them is the debug component. The debug component is already in Drupal 8, but it's not used. It's already in Drupal 8 because it's a dependency or the HTTP kernel component, which is used by Drupal. Which means you don't have to do anything to use it. Only write code. What this component does is it takes all the PHP error levels and whenever one is triggered, it's just map these notices, warnings, anything, to the PSR3 logging system. So do you know PSR3? Yeah, who knows? Okay, so PSR3, so the PSR, PHP standard recommendations, which are standards that are used by symphony, by Drupal, by many other projects that define interfaces. And one is the PSR3, which defines some interfaces to log, to log any message. So there is a method that is called log, another one which is called warning, another one which is debug, so it depends on the level. You have several methods, one per level. And what this does is it takes a PHP error and it maps that to a logging level error. Which allows them to reuse any logging system that is PSR3 standard. Another thing that is done by the debug component is converting PHP errors into exceptions. I told you about that because this is what symphony is using by default. So any error is converted to an exception. This is an option. So you can configure and get logging or throwing. Because just before I told you there's mapping, when you can map, of course, PHP errors to exceptions, which means no logging, because you have the exception. There's no need to log that. The error handler mechanism of PHP allows you to have access to local verse, to the local scope. And so it means local variable that's where defined at the time the error was triggered. So with the error handler, we are able to get them and log them and put them in the exception what you want so that you can know what were the states in the local method that triggered the exception, triggered the message, with the stack trace also. So you have the message and you know how PHP ended up in this situation. We have unsilenced configuration to tell to the logger or to the debug component which error should not be silenced. I told you already about that and we use it in symphony. And it's able to turn fatal errors into exceptions. So this is done, you know now how to do that.  Especially you can re-inject it into the logging system. So that's the job of the error handler. We have another utility class which is the exception handler, the exception handler has a job which is to generate HTML by taking just an exception instance as argument. You do an exception handler, handle exception and it displays this kind of HTML pages. The other thing, the other useful class is the debug class loader. So the debug class loader has three main use case. One is to stack compile time error. So this is really an edge case in PHP where some errors can't be logged properly at some stage which is at some compiling stage in fact. So you don't have to know full details about that but the debug class loader allows you to not end up in a trap which exists in PHP which is this one. Another feature is to force unsaliencing of past errors. I'm sure or at least I did one day have a white page without any error message and this was because after several hours this was because of some at scene in front of an include. So the at scene set says just don't log any error. This is really, really bad when you have some past error, some fatter error in the include in the full PHP file because you have the error you said to not log it so you don't have, you have the age closed and you can deal with that. So what the debug class loader does is that it changes locally the error reporting level and it forces past errors and some other kind of errors to be unsilenced so that you will get them and you'll see them and I'm sure you never want to silence them. Another example and maybe the last feature of the debug class loader is sniffing and trying to find case mismatch between loaded declared class names and the fine name in which you put your class declaration. On Linux this doesn't matter very much because on Linux we have a case sensitive file system so whenever you do some typo you will get a fatal error saying okay, but I'm sure many of you have Mac OS and Mac OS has case insensitive file system and Windows also have a case insensitive file system and we added this to the debug components because one day one of our developer wrote something and we pushed it to prod and we broke the prod because he was on Mac and he has a typo. So now, fortunately, we have this and this is able to check that this won't happen again. It won't happen again to you also now. So case mismatch between loaded and declared class names trying to load a class with an invalid name this is really a raw edge case. Fine, the file was found but the class was not in it so you look for food.php we find food.php, we load food.php but there is no food class in food.php. What does that mean? So maybe you're missing the namespace, something like that. And then we also have the case with case mismatch between class and file name. A last feature is that the debug class loader is able to inspect the method that you're calling the class that you're calling and the interface that you're using in your code and it's able to warn you by just adding a message in the log system to warn you about deprecated interfaces, abstract classes that you are using. This may be not useful right now but one day you will have legacy code and one day this code will be deprecated by the main author, some library and so you will know how to fix your code because the code will tell you, this is deprecated, you should use that now. Okay, let's change component. This is the second component. So the Vardrumper component is about displaying the state of any variable. So the mission statement of the component is to generate some easy to read HTML or common line output. The second feature, mission of the component is to provide an accurate, very accurate state representation of any variable, an array of float and int. We don't want to represent one and one dot zero in the same way so that you can know that this is a float, this is an int and you have the hint to understand the very accurate state of any PHP variable. PHP proof, this is also very important because PHP is full of edge cases and when you are debugging, you are in an edge case, usually. So it means that the component is not allowed to break and we try very hard to test it in every crazy situation so that you can dump in any situation. And then, last but not least, we want it to be extensible and reusable which means that I will present you the components and you will see it from the outside and the outside is one feature to represent the state, so to dump, it's just a valid prepressment. And internally, it's an API and interfaces and the classes that allow you to just build something else on top of the core algorithm and core interfaces so that you can extend it and provide some other representation, anything you want to build on top of that. Okay, let's do some examples. So this is a simple array. So very easy to understand, I guess. So we have five elements, a simple string in an array of five elements, a float, an integer, a boolean, an empty array. As you can see, it's pretty straightforward. This is a kind of complex array. So this array has internal references which means that some indexes are just aliases to other indexes. And in this case, we have the index zero, index one, and they both hold the same value, but in fact, not because they're the same two at two different positions because it's the same position. Both index are a reference of each other which means that if you change index one, you will change index zero. So this is displayed with this E, the 1% one, and we have the same representation just for an array. So in index two, index three, we also have the an alias, and in this case, we put an array there. So you can see that we opened the first one and we collapsed the last one. So this is something that you cannot know currently with tools, displaying tools, and sometimes you will have a bug, one day you will have a bug, and the bug will be related to this, and you will need the tool to see what's the data structure that you're using, or maybe someone made you to use. This is a simple object. So a simple object has one public property. So with a plus prefix, so plus means public, the sharp prefix protected property, and the dash prefix for private properties. This plus sharp and dash is a convention that is used in UML. So if people, some of you are used to that, you should be familiar with that. We could have invented something else, but we shouldn't. When there are standards, it's better to make everyone aware of it and so that people raise their knowledge. Okay, so let's talk about internal things. So how does this work? We have a variable, which is doll over. First, the first step to get this kind of representation is to take a var cloner object, which is something that is implemented in the var dumper component, and to use it on our var variable. The output of this call, which is, there's a method which is called cloner var. So whenever we do cloner cloner var of vars, then we get back data object. Data object is again some internal thing and it's representing the exact state of the var variable, but it's not the var variable anymore, it's something else. Then, what the var cloner does inside internally is that it uses casters to extract accurate representation about all your custom objects. So this means that if you're using doctrine and you don't want your entities to be dumped with the entity manager, which is a very huge object, then you can write a caster and the caster will have some implementation saying, okay, this is an entity. I don't want the entity manager to be dumped because I don't care about it. Let's remove it from the representation and then represent it. And what the var cloner also does is that it enforce state extraction limits. This just means that we can have a max level, have a max items, max string length, so that you don't dump the full PHP state but you can limit your representation to the first levels, nesting levels of your objects. So the resulting data object from the cloning of the var variable is basically internally just a simple PHP array that holds full precision over the state of the initial var, which means that it's just if you remove all the limits, it's an exact representation of the variable that we are going to dump and you can serialize it and put it on a file. You can store this object in a database, do something else with it, forward it to some remote server, it has the state and you will be able to represent it later in the process if you want. So there is a separation between extracting the state which generate this and then dumping, representing this thing. So then this is done, this job representation is done by what we call a dumper object. So we have two, a key dumper, so command line dumper and HTML dumper, maybe your dumper, you can write one. And this one turns the data object into a string representation. A string representation is what is displayed on your screen so HTML command line thing. And then this string representation is written to any PHP stream or any line callback. So you can hook into this and say, okay, I don't want this to be printed on the standard output on the output of my web page. I want this to be output somewhere else, maybe in a file, maybe on the standard error stream, maybe on the network protocol stream, maybe on some callback. So callback will be called for every line that is generated for the representation so that you can do anything, any wiring you want with the output. So this is another example. This is what I call a complex object. Why is it complex? Because it's, so in this case, it's a redis object. So redis is the database and the redis object is PHP driver implementation that is able to connect to redis, the same kind of, it's database connection, redis database connection object. And usually this is provided by the redis PHP extension. And if you dump this using Vardom, for example, of using printer, you will get only the first line. The first line will tell you, okay, this is a redis object and it holds one public property which is socket, which is a redis socket buffer resource. By using a caster, and this is why I put this example here. By using a caster, you can add useful information so that you have more information when you're dumping this object. In this case, we have a redis connection and on the redis object, even if it's not an internal property, private or public, there is a state. There is a state and the state can be read by using some is connected method, get host method, get port, get hot, get DB number, get timeout, get persistent ID. So if you're working with redis object, you have to know that you can inspect the state of the redis subject by using this method. What you can do with the Vardom prequipment is code that knowledge into a caster and then the caster will just know that for you and whenever you end up doing dump from some redis object, you will have this representation. So this representation is redis aware. Enjoy. This is the implementation. So the implementation says basically that it's constricting some array as you can see and the array calls all the interesting function on the redis object so that then the representation is generated by using this array. That is constricted there. So this is just a public static function which means there's no state, there's no object. It's really simple. If you know, you maybe need to read some documentation about that to know the exact meaning of the arguments but anywhere as you can see, there is some knowledge here which is how to access the state of the redis connection object. And we have many of them and we add many more over time because this one is very new. The previous one was maybe a PostgreSQL connection displayer so we now have a nice display for this kind of object and so on. Okay, this is the kind of code you need to do if you want to dump by hand. So this is the implementation of what I tried to explain you before. So at link four, we create a cloner, so a new var cloner. Then we create a cleadumper. Then we pre-press some stream output, so some PHP memory buffer and let's go in on line eight, we call cloner, cloner var of some variable and then the output of this, the return value is data object. We give this data object to dump per dump and dump per dump will generate the string on the output that is the last argument there. Then you get the output when we stream get content on the output resource and that's it. You have a variable with the string representation of the variable. Okay? Okay, let's practice, what time is it? Okay. It's a lot simpler that one. You may have. The first thing, so symphony var dumper is just a standard composer package that you can require. So you do composer require, symphony var dumper and that's it. That's it. It works on Drupal 6, on Drupal 7, Drupal 8 and symphony on in fact any PHP application. This means that when you, composer require symphony var dumper, you will get automatically a dump function. So then you just dump some variable, dump and that's it. You get the representation. This is able to automatically switch between HTML or CLI depending on the runtime context. You can also install that using composer global require and using also some auto initiating configuration. If you do composer global require and then auto prepen file in your PHP file you will get dump all the time without doing anything on all your project. It will be installed globally on your laptop. Okay, let's try. So here I have a small Drupal application. Okay, this is standard directory listing. I have a demo PHP file. Okay, it's empty. Can you see? We'll see this one is, okay. So we need the auto loader of course to load our dependencies and then let's just dump. Okay, one, two, three. That's it. We are not in a Drupal application. We are just in the bare minimum PHP script. So we can try any variable here. So of course an array. Here's our array. And we can do some Redis connection. Redis, then I have a Redis server running there. So let's connect some local hosts. We have a connection object. This is the representation that you saw on the slide. But now it's live. Okay. In a Drupal application, you can use this and you can enable everything I told you about by changing your settings local PHP file. And if you add this at the end of the file, you will get the debug components enabled so that you'll get error reporting in this kind of symphony way. So let's do that. So I think, okay, the Drupal server is there. It's just Drupal server running. Okay. I have my application there. So, okay, this is a BANYET application. And so the BANYET application has, let's start. Okay. So here is a controller which, okay, it's an usual controller for Drupal application. And in this case, let's say I want to dump my BANYET. Let's back. I didn't enable the debug components right now. Okay. I'm back to demo time. Okay. So we have an error and define variable BANYET. So this is okay. This is because I plugged, in fact, everything. So this is the error page that I plugged with the dump function so that we dump whenever we have an exception so that we have more context and maybe more friendly display. Let's see this one. So in this one, we have some noticing and define variable BANYET, which obviously has a typo. We have some context. We have a number variable which is called number. I guess in the code we'll see that there's a number variable. And we also have one which is BANYET, which is the one I was trying to dump. And it has a strawberry. It is strawberry field. Can you see there? Maybe I need to zoom. Okay. Much better. So let's continue because we have more information there. We have a stack trace. So the stack trace shows us the list of functions that have been called up to our controller. So if I go back at the end, in the main function, which is the abstract root node, and then this index PHP file, in fact, is calling Drupal kernel handle. And you'll know that because you maybe have already opened the index PHP file. And this one is calling the stacked HTTP kernel handle and so on. So this is a typical Drupal call stack. We end up triggering this exception with the codex there showing that this is the line that is triggering the exception. Okay. And we can inspect and get all the lines and the arguments. So dump and then we had one argument which was this one because we are still in the error handling part. And we can continue and see there that we have, okay. Drupal is doing many things there with symphony help and we have many things. So let's fix that. But in fact, we already saw the value and I know it for that. What else? Okay. So let's see this one. I don't need this. I'm in my settings default. And then the settings local file. So in this file, I have this which enables the debug class loader so that whenever I do some typo, I will get the right message. I have the exception handler and I have also the error handler and this is why we're getting this strange error page with the black background doing everything. Okay. There's also something else we can do. Maybe this is just advanced and this is just to show you that you can also plug everything as you want. In this case, I plugged an event subscriber for the kernel exception event because I told you that whenever an exception is triggered and is not dealt with by any code, then it will end up in the kernel exception event and this is something you can listen for and in this case, I have one listener. So this is the part, let's forget about this one, but the first lines. So this is the service declaration for our exception subscribers. So we say whenever you need to, okay, if you need to register the event, let's look at the exception subscriber class and this one will tell that we'll deal with this. Okay. Let's go. We have the class here and the class is just doing this. Sorry. So this is the implementation and this is an event subscriber and the event subscriber has the bottom function is just a static declaration function saying this class, the own kernel exception method should be called whenever a kernel exception event is triggered. So that's the last part and the first part is the function that is called whenever an exception is triggered and in this case, what we do with the exception with the event, in fact, the beginning is get the exception that is inside the event and just dump it, the same dump function that we used before and we set the response with a new response which means blank page because dump already output something so we don't want anything else. Okay. So this will display a very nice page, nice in term of this kind of page. If we have a few minutes and a few minutes of batteries also, we can write something else which is some, let's do our D, D for debug, D function, let's do it together. So I want my D function to output somewhere else. So let's create a cloner. So this will be a new var cloner object. Let's do some clidumper because you'll see what I want to do later. So when doing a clidumper object, then okay, let's forget about indentation because it doesn't work. Then let's get our data from the variable. So it's cloner clone var from var. Okay, so now we have the data object and let's dump it. So clidum from our data object and this is where I want something special to happen which is that I want the output on the standard error of our PHP process. There's no pass error there. Okay. Let's use it, use it. So let's do the controller. Nothing there, but here it is in the log of our web server. So we didn't alter the output at all and we have some console output even though we are in the HTML context. So what's next? Maybe some native Drupal integration because some wiring are not that easy. Maybe a var dumper module. There is one already existing. I tried it, there's still work to do. Don't wait after others which means you can write the code because it's an open source project and Drupal is and you already know how to use dump, just ComposerRequire, SymphonyVarDumper and happy then. So if you have any questions, I'm here. Just come to me. Yeah? It's really good. Thanks. There are a couple things there. Yeah? It's great. It's awesome.


Welcome to Happiness Isn't Brain Surgery with Doc Snipes. This podcast was created to provide you the information and tools Doc Snipes gives our clients so that you too can start living happier. Our website, docsknipes.com, has even more resources, videos and handouts, and even interactive sessions with Doc Snipes to help you apply what you learn. Go to docsknipes.com to learn more. Welcome back to part two of Happiness Isn't Brain Surgery with Doc Snipes, practical tools to improve your mood and quality of life. We're going to continue focusing on strengths, needs, attitudes, preferences and temperament in this section. We're going to start now moving into the temperament though and figuring out how temperament or some people call it personality impacts every aspect of your life and explore how knowing your temperament and that of other people can help you reduce your stress. And I'll give you some examples because my children's temperaments are somewhat different from mine and somewhat similar. So we'll talk about how knowing the way they function helps us move forward a little bit faster and helps me kind of create win-win situations. Your temperament or personality impacts your strengths, needs, attitudes and preferences. It's comprised of four dimensions and I generally characterize these in the following way. The first dimension talks about the type of environment that you prefer and where you get your energy. The second dimension talks about how you conceptualize things, whether you're kind of broad strokes and big picture or you're detail oriented. The third aspect refers to where you find motivation and meaning. Is it based on facts and black and white sort of things or is it based on doing what makes the most people happy and content? And the final temperament dimension is based on time management and structure. Some people prefer to be really spontaneous. Others like myself really prefer to have very detailed date books and we like schedules. The overarching concept is that temperament is on a continuum. You're not probably going to be all one, extremely one or extremely the other. Now this may or may not be true for one or two dimensions but you're not going to be pure in virtually any of them. So understanding that this is just kind of a general way of looking at things and everybody's on a continuum. One end of the continuum like being spontaneous is no worse than the other end of the continuum such as being extremely structured. But understanding how that impacts your life, your recovery and your relationships is really important because if you're super structured and in a relationship with somebody who's super spontaneous, spontaneous person may get bored really easily, structured person may get really frustrated at the spontaneous person's desire for, you know, just getting up and doing something on a whim. We'll talk about how to kind of try to make that work together. So the first dimension, extroverts, they tend to be expansive and less passionate. They're all over the place. They're really interested in a lot of things. They're easy to get to know, like meeting new people, figure things out while they talk. Remember I talked about active learners in the last section. A lot of times extroverts want to talk things out and even if they don't have somebody to talk to, they may talk things out to themselves and that's okay. It's knowing how you process things best. They often enjoy background noise. They don't like it to be too quiet. It can be instrumental. It doesn't have to be television, but they enjoy having some sort of stimulation, some sort of sensory input. They are more aware of what's going on around them than inside them, which can be kind of a hiccup in recovery, but also in relationships. If they're more attuned to what the other person wants or needs and not paying attention to what they want or need, it can cause problems in the long run. They often don't mind interruptions, which is great if you're a parent because kids like to interrupt, which gives them a little bit of flexibility in certain situations where an introvert might not have that. And they're often considered good talkers because they like meeting new people and talking things out. So extroverts tend to be very jovial. You might think of them as more social butterflies. Introverts on the other hand are intense and passionate. They're the person who latches on to something and they want to know everything there is to know about whatever that topic is. They may not know about 50 different things. They may only know about five. But those five things they know a lot about, I won't say everything, but a lot. They can be difficult to get to know because they tend to be intense and passionate and very involved and aware of what's going on inside them and less aware of what's going on around them. So they might not notice other people wanting to befriend them, wanting to engage in some sort of social dynamic with them. They have to exert effort to meet new people. And I want to make it clear here that introverts are not anti-social at all. They, the energy that comes from another person and the energy that's required to get out of their own skin and figure out what's going on with another person is exhausting for somebody who's an introvert. So it can be exhausting for them, which is why they prefer smaller groups. They like to figure things out before they talk. They've got a problem, they may go on a walk, they may take some quiet time, they may take a bath and think it over and then find somebody and go, okay, here's what's going on. So if the introvert and extrovert are in a relationship and the extrovert sees something going on, like, hey, what's going on with you? The introvert may be like nothing, you know, don't worry about it. I'll tell you about it later. The extrovert wants to know now. They want to help solve it. They want to talk it out because that's how they solve problems. The introvert, on the other hand, just needs some time to get their thoughts together and then they will share it. Introverts often prefer peace and quiet because, again, processing external stimuli, whether it's music or television or anything else, can be draining on that person. Like I said, they're more likely to know what's going on inside them. They're aware of their curiosities, they're aware of their tired, they're aware of a lot of stuff. They may not be aware of the impact they're having on people around them. They do dislike being interrupted, though. So you'll find that people who are introverts tend to prefer to be in jobs where they can focus, accountants, scientists, those sorts of things. Yeah, you may find some people who are in medical professions where they have periods where they talk and then somebody else talks, but it's not where they're going to be in the middle of doing something and then all of a sudden have to switch gears. Most introverts don't do well in things like sales or law enforcement. They can, but it's a lot more stressful to them. They are often good listeners, however. So introverts are people that you want to have kind of around when you need to bounce something off of them. So extroverts and introverts are awesome and you'll see this with every temperament because they balance each other out. They're like yin and yang. You put them together, it forms a nice, balanced whole. And it's a matter of figuring out the temperament and style of the significant others in your life and how you balance them and how you mesh with them to figure out how you create a cohesive relationship. So quick questions. You're not going to have them probably. Go take a temperament sorter or some sort of inventory to figure out their temperament. So ask yourself, does the person prefer to think then talk, which would mean they're probably more introverted or talk while they're thinking. I talk while I'm thinking. Somebody will accuse me of being an introvert for the most part and does the person prefer quiet and hate interruptions or love being around others and prefer activity. And I'm the same way where I like being around others. I like having the stimulation and the energy from other people. Does the person enjoy larger groups or prefer smaller groups, you know, two to eight people, maybe a couple couples going out to dinner is probably the max. Think about what they prefer, for example, to celebrate their birthday. Do they want to go to a concert or do they want to go to a quiet dinner for two? One is not better or worse than the other. It's just different. So understanding what that means is important. And is the person a better listener or a better talker? Now extroverts can be very good empathetic friends. It's not to say that they aren't. The introvert tends to listen and reflect before they say anything while the extrovert may engage in more of an interactive discussion. Extroverts and introverts are terms generally used to describe the types of social interactions they prefer. So for example, as I told you, I'm an extrovert. I love being around people. I love the energy I draw. I prefer to work out at the gym as opposed to in my own basement because I draw energy from other people. I like having a lot of friends and knowing a lot of people. My daughter, on the other hand, it's exhausting for her to be in situations where there's a lot of activity and a lot of people and a lot of stuff going on. She's working as a camp counselor this week. And she came home yesterday from camp and was just totally exhausted. She actually seemed to get her energy back, though, as the evening went on and she had some quiet time to recharge. The types of environments that they prefer are obviously one that's more quiet or one that's more stimulating, where they derive their energy. Extroverts derive their energy from other people. They go into a meeting and they get a lot of energy and ideas and creative juices from being around other people. I guess on the other hand, find that they feel more energetic and more grounded and more focused if they have downtime. When I was working at the treatment facility, we had 84 people in residence. And there were eight people to a room. There was not such a thing as quiet downtime in the facility. So for people who were introverts, we needed to find places on the campus where they could go and have downtime and be safe because they had to be under supervision. And extroverts and introverts solve problems differently. So remembering that just because your introverted partner may not come and just dump out everything that happened that day the minute they get home, it doesn't mean that they don't care or they don't think you care. It may mean they need time to kind of compile all their thoughts and then they'll share it with you. Extroverts often have many friends enjoy large groups and energized situations. They're very able to handle interruptions and think while they speak. So they are really good at sales. They're really good at performing, really good at teaching. Anything where they can be around a fair number of people. Introverts tend to have a few close friends prefer smaller focused groups in quiet environments with few interruptions and prefer to think then speak. If you're dealing with introverts, if you're a therapist and you're dealing with introverts in group, don't call on that person, especially if they're a reflective learner, which most introverts tend to be. Every time there's a question, they need to have time to take in the information that they heard in group, preferably during a short break and then come back and say, these are my observations. Extroverts and introverts together, extroverts need social interaction. They are going to be very, very unhappy if they feel like they don't have friends and social outlets where they can go get energy, feel recharged. It's not that they need to go to those interactions for validation, but stimulation. So they're not trying to find another best friend or another significant other. They're not trying to be rejecting of the introvert. They just need to have input from more people and they need to have the energy from different environments, whereas the introvert would find that extremely off-putting. So extroverts can get their social needs met through going to maybe recovery meetings or volunteer group meetings, retreats, participating in different types of community activities like fun runs, where they all share a same purpose and they can get excited and energized and bond over something. Extroverts also need someone to bounce thoughts off of. Who tends to be a good listener, which is why extroverts and introverts go so well together? Now it's not that the extrovert can't solve their own problems. They're very good at it. But they think while they talk and they process and move on. So it's helpful to have another living, breathing human being in the room to occasionally stop and paraphrase or provide some input. Extroverts are more aware of what's going on with those around them and may pick up on relapse warning signs in other people. And as I always say, this can be depression, anxiety, anger, or just not taking care of yourself. So extroverts may point that out. Introverts need to be careful not to take that too personally. Hear it, check it. If it's useful, keep it. If they seem to be off base, let it go. Generally they're not trying to be harmful or critical or anything like that. They're actually trying to be helpful. Introverts may choose to encourage the extrovert to engage in social activities independently. Whereas extroverts need to make sure introverts have downtime. They've got time where they can just be quiet and not take it personally if the introvert is quiet or sitting out on the porch by themselves. It's not a rejection. It's just how they process. Introverts may need to address abandonment and self-esteem issues in relationships with extroverts for the aforementioned reasons. Because the extroverts are not going to be content just engaging in that one-on-one relationship with their significant other every day. They need to have social stimulation. They may choose to bring along the introvert, but if they realize that it's unpleasant or uncomfortable for the introvert, they may say, you know, I'm going to go out. You don't have to come if you don't want to. It's not a slight. It's the extrovert trying to be respectful of what's draining to the introvert. Introverts may be less aware of how their presence impacts others, which can be a hurdle in relationships. So if you have an introvert that is mauling something over, really distracted by something, especially in a relationship with an extrovert who wants to know what's going on, help you solve it, let's talk about it. That's not how the introvert processes things. So the extrovert needs to be able to know that when the introvert's ready, they'll come over and discuss it. In a relationship, you may set guidelines and, you know, protocols, if you will. That's my judging personality. I really like structure. Anyhow, if one partner is an extrovert and wants to know and be in the loop and help the introverted partner, maybe having a time where you know that the introvert is going to be able to come home, have 30 minutes or an hour to kind of get their thoughts together and decompress, and then they'll share their day or they will share what they're thinking about at a certain time will help the extrovert feel like they're kept in the loop and help the introvert avoid feeling pressured when they've got to figure something out. In recovery, extroverts thrive and support group meetings. They draw energy from being around those other people and need the stimulation of discussing recovery and life in general, because that keeps it in the forefront of their mind. They may notice someone else's relapse warning signs but miss their own. So extroverts need to focus on mindfulness and active reflection. You know, constantly checking in with themselves and going, where am I at, how am I feeling, what are my motivations. Extroverts need to understand how their introvert partner gets grounded and what their recovery program or wellness program looks like. I see a lot of conflicts arise when there are two people who are in substance abuse recovery and one person is very, very 12-step oriented, loves going to meetings, gets a lot out of them and the other partner not so much. And a lot of times it can turn into criticism that the introverted partner not getting anything out of the meetings is not in recovery or is on a relapse slide. Many times that's not true. Many times what we need to do is look at are you getting the same benefits? Are you getting refocused? The introvert may take time to write in a journal or meditate or reflect in order to get grounded and review their relapse prevention goals and do that by themselves or in a small group like a big book study or a Bible study or something that is meaningful to their recovery. So just because they don't enjoy or benefit from large group meetings doesn't necessarily mean that they're in the process of relapse. It may mean that their program is a little bit different. And the same thing is true for any sort of health and wellness behaviors. Not everybody enjoys a crowd. Introverts often prefer small groups like big book or Bible studies and need that quiet time to get grounded and focus. They prefer to ponder recovery and life independently then discuss it. So introverts can use workbooks, journals, meditation. There are a lot of different things that introverts can use to stay mindful and keep working their program that doesn't involve going to a large sort of impersonal group. Introverts may notice relapse warning signs but not feel comfortable in traditional recovery environments. So it's important for them to be able to reach out to or find places that they can go when they feel like they're struggling with their depression, their anxiety, their cravings that meets their needs, whether it's an online meeting or a small big book study or a support group at a church or whatever it is that works for them. If you like this podcast, you can subscribe on your favorite podcast app. Join our Facebook group at docsknives.com slash Facebook or join our community at docsknives.com. Thanks for tuning in to Happiness Isn't Brain Surgery with Doc Snipes. Our mission is to make practical tools for living the happiest life, affordable and accessible to everyone. We record the podcast during a Facebook live broadcast each week. Join us free at docsknives.com slash Facebook or subscribe to the podcast on your favorite podcast player. And remember docsknives.com has even more resources, members only videos, handouts and workbooks to help you apply what you learn. If you like this podcast and want to support the work we are doing, for as little as $3.99 per month, you can become a supporter at docsknives.com slash join. Again, thank you for joining us and let us know how we can help you.