From jt at plainblack.com Mon Aug 1 14:08:35 2005 From: jt at plainblack.com (JT Smith) Date: Mon, 01 Aug 2005 16:08:35 -0500 Subject: [Chicago-talk] super complex object Message-ID: I have created a monster super complex object. It only has a half dozen properties, but those properties can be manipulated in a near infinite number of ways. The problem is that I want my main class to have all sorts of methods for use by the subclasses in order to keep the subclasses small. The problem is that I now have a master class that has almost 100 methods in it. That just seems wrong to me, but at the same time, every one of the subclasses uses all of those methods at one time or another, so I can't just get rid of them. And since they're always in use by all the subclasses, it doesn't seem to make sense to create any sort of middle tier subclass. What I'd like to do is break them out into seperate files by functional groupings, but bring them all in as methods to the master class. Does that make sense to do? Is there a good way to do it? I've also been trying to figure out how I can break the master object down into simpler classes that the master can then inherit from, but I haven't been able to do it. The methods seem to rely on each other too much to make that work. Any suggestions? It seems that I can't be the only one to have run into an overcomplicated object. Help a brother out. =) JT ~ Plain Black ph: 703-286-2525 ext. 810 fax: 312-264-5382 http://www.plainblack.com I reject your reality, and substitute my own. ~ Adam Savage From ehs at pobox.com Mon Aug 1 14:25:18 2005 From: ehs at pobox.com (Edward Summers) Date: Mon, 1 Aug 2005 16:25:18 -0500 Subject: [Chicago-talk] super complex object In-Reply-To: References: Message-ID: On Aug 1, 2005, at 4:08 PM, JT Smith wrote: > Any suggestions? It seems that I can't be the only one to have run > into an > overcomplicated object. Help a brother out. =) It sounds like you've got a God Object on your hands [1]. My advice would be to try to take a new look at your problem domain with something like CRC cards [2] and try to get a better sense of the classes and their interactions. //Ed [1] http://en.wikipedia.org/wiki/God_object [2] http://c2.com/doc/oopsla89/paper.html From thomasoniii at gmail.com Mon Aug 1 15:10:44 2005 From: thomasoniii at gmail.com (Jim Thomason) Date: Mon, 1 Aug 2005 17:10:44 -0500 Subject: [Chicago-talk] super complex object In-Reply-To: References: Message-ID: <5cfdfaf7050801151046de40c@mail.gmail.com> If this were Objective-C, it'd be easy. You'd break things out into categories and be all set. I think the C++ term is a mixin. Since it's perl, it's still easy, just less formal. For example: package God; use God::Stuff; use God::OtherStuff; use God::FunctionBucket; 1; then, in your various other modules: #God/Stuff.pm package God; . . . 1; Note the important distinction - place it in God/Stuff.pm, but name the package God. Everything goes into the God namespace. I'm not sure what sort of maintenance headaches this would create for you, though. You end up with bunches of function buckets that can't operate on their own. (If you want a slightly more formalized approach, you can take a look at Class::Mixin on CPAN) Further, if you can't figure out how to break the object into other objects to inherit from, it may also be difficult to conceptually break things up into function buckets in this manner. And, finally, it may actually be true that your super complex object is too, well, super complex. Re-factoring may be appropriate. -Jim.... On 8/1/05, JT Smith wrote: > I have created a monster super complex object. It only has a half dozen properties, but > those properties can be manipulated in a near infinite number of ways. > > The problem is that I want my main class to have all sorts of methods for use by the > subclasses in order to keep the subclasses small. The problem is that I now have a > master class that has almost 100 methods in it. That just seems wrong to me, but at the > same time, every one of the subclasses uses all of those methods at one time or another, > so I can't just get rid of them. And since they're always in use by all the subclasses, > it doesn't seem to make sense to create any sort of middle tier subclass. > > What I'd like to do is break them out into seperate files by functional groupings, but > bring them all in as methods to the master class. Does that make sense to do? Is there a > good way to do it? > > I've also been trying to figure out how I can break the master object down into simpler > classes that the master can then inherit from, but I haven't been able to do it. The > methods seem to rely on each other too much to make that work. > > Any suggestions? It seems that I can't be the only one to have run into an > overcomplicated object. Help a brother out. =) > > JT ~ Plain Black > ph: 703-286-2525 ext. 810 > fax: 312-264-5382 > http://www.plainblack.com > > I reject your reality, and substitute my own. ~ Adam Savage > _______________________________________________ > Chicago-talk mailing list > Chicago-talk at pm.org > http://mail.pm.org/mailman/listinfo/chicago-talk > From jt at plainblack.com Mon Aug 1 15:55:09 2005 From: jt at plainblack.com (JT Smith) Date: Mon, 01 Aug 2005 17:55:09 -0500 Subject: [Chicago-talk] super complex object In-Reply-To: References: Message-ID: See I've tried to move it to an MVC pattern, but I lose several points of efficiency as well as making it slightly more complicated for developers to put together subclasses of this class. Under normal circumstances I'm of the mind to create very simple objects with only a couple properties and only a couple methods, but in this case I'm more concerned with performance and ease of development than I am of good coding practices. That's why I was looking for the mixin approach that Jim shoved out. Thanks for the response though. On Mon, 1 Aug 2005 16:25:18 -0500 Edward Summers wrote: > > On Aug 1, 2005, at 4:08 PM, JT Smith wrote: >> Any suggestions? It seems that I can't be the only one to have run >> into an >> overcomplicated object. Help a brother out. =) > > It sounds like you've got a God Object on your hands [1]. My advice > would be to try to take a new look at your problem domain with > something like CRC cards [2] and try to get a better sense of the > classes and their interactions. > > //Ed > > [1] http://en.wikipedia.org/wiki/God_object > [2] http://c2.com/doc/oopsla89/paper.html > _______________________________________________ > Chicago-talk mailing list > Chicago-talk at pm.org > http://mail.pm.org/mailman/listinfo/chicago-talk JT ~ Plain Black ph: 703-286-2525 ext. 810 fax: 312-264-5382 http://www.plainblack.com I reject your reality, and substitute my own. ~ Adam Savage From jt at plainblack.com Mon Aug 1 15:56:13 2005 From: jt at plainblack.com (JT Smith) Date: Mon, 01 Aug 2005 17:56:13 -0500 Subject: [Chicago-talk] super complex object In-Reply-To: <5cfdfaf7050801151046de40c@mail.gmail.com> References: <5cfdfaf7050801151046de40c@mail.gmail.com> Message-ID: Ooooh. Mixin's. I had forgotten about those. I used to use those when I coded Lisp about 10 thousand years ago. That's very cool. I'll go with that. Thank you very much. On Mon, 1 Aug 2005 17:10:44 -0500 Jim Thomason wrote: > If this were Objective-C, it'd be easy. You'd break things out into > categories and be all set. I think the C++ term is a mixin. Since it's > perl, it's still easy, just less formal. > >For example: > > package God; > > use God::Stuff; > use God::OtherStuff; > use God::FunctionBucket; > > 1; > > then, in your various other modules: > #God/Stuff.pm > > package God; > . > . > . > 1; > > Note the important distinction - place it in God/Stuff.pm, but name > the package God. Everything goes into the God namespace. > > I'm not sure what sort of maintenance headaches this would create for > you, though. You end up with bunches of function buckets that can't > operate on their own. > > (If you want a slightly more formalized approach, you can take a look > at Class::Mixin on CPAN) > >Further, if you can't figure out how to break the object into other > objects to inherit from, it may also be difficult to conceptually > break things up into function buckets in this manner. > > And, finally, it may actually be true that your super complex object > is too, well, super complex. Re-factoring may be appropriate. > > -Jim.... > > On 8/1/05, JT Smith wrote: >> I have created a monster super complex object. It only has a half dozen properties, >>but >> those properties can be manipulated in a near infinite number of ways. >> >> The problem is that I want my main class to have all sorts of methods for use by the >> subclasses in order to keep the subclasses small. The problem is that I now have a >> master class that has almost 100 methods in it. That just seems wrong to me, but at >>the >> same time, every one of the subclasses uses all of those methods at one time or >>another, >> so I can't just get rid of them. And since they're always in use by all the >>subclasses, >> it doesn't seem to make sense to create any sort of middle tier subclass. >> >> What I'd like to do is break them out into seperate files by functional groupings, but >> bring them all in as methods to the master class. Does that make sense to do? Is there >>a >> good way to do it? >> >> I've also been trying to figure out how I can break the master object down into >>simpler >> classes that the master can then inherit from, but I haven't been able to do it. The >> methods seem to rely on each other too much to make that work. >> >> Any suggestions? It seems that I can't be the only one to have run into an >> overcomplicated object. Help a brother out. =) >> >> JT ~ Plain Black >> ph: 703-286-2525 ext. 810 >> fax: 312-264-5382 >> http://www.plainblack.com >> >> I reject your reality, and substitute my own. ~ Adam Savage >> _______________________________________________ >> Chicago-talk mailing list >> Chicago-talk at pm.org >> http://mail.pm.org/mailman/listinfo/chicago-talk >> > _______________________________________________ > Chicago-talk mailing list > Chicago-talk at pm.org > http://mail.pm.org/mailman/listinfo/chicago-talk JT ~ Plain Black ph: 703-286-2525 ext. 810 fax: 312-264-5382 http://www.plainblack.com I reject your reality, and substitute my own. ~ Adam Savage From lembark at wrkhors.com Tue Aug 2 00:08:30 2005 From: lembark at wrkhors.com (Steven Lembark) Date: Tue, 02 Aug 2005 03:08:30 -0400 Subject: [Chicago-talk] super complex object In-Reply-To: References: Message-ID: > Any suggestions? It seems that I can't be the only one to have run into > an overcomplicated object. Help a brother out. =) Do you really need ALL of the functionality in one object? When I see that many manipulators I get the feeling that some number of separate objects have been glommed together. For inheritence: are all of the attributes and functionality related via "isa" or is this one simple object that "has-a" copy of a few others in it (i.e., helper objects)? Perl is nice -- and one of the few OO languages avilable -- becuase its classes define *behavior* (vs data). Question, then, is how much of the behavior is really intrinsic to the object's function -- or might better be moved into behavior of contained objects? For example, if you have an "ftp" object and start to notice "socket" behavior creeping into an interface that otherwise only has get/put/cd/dir then you probably are inheriting from a socket rather than containing one. That or you aren't leaving the encapsulated socket to its own behavior via method calls but are inheriting its behavior into the FTP object. If you can group the behavior in to "top" and "bottom" level behaviors then the bottom stuff is proably better off encapsulated where the main object's methods can't see it. That or you may have a zillion mutators for some set of things that might be better described via parameters. If many of the behaviors are rather similar then you might want to just have a single method for some of them and modify its behavior via the object's state or method call arguments. What is the things really supposed to do? -- Steven Lembark 85-09 90th Street Workhorse Computing Woodhaven, NY 11421 lembark at wrkhors.com 1 888 359 3508 From jt at plainblack.com Tue Aug 2 07:38:57 2005 From: jt at plainblack.com (JT Smith) Date: Tue, 02 Aug 2005 09:38:57 -0500 Subject: [Chicago-talk] super complex object In-Reply-To: References: Message-ID: > What is the things really supposed to do? This is the base class of an application object. Everything that can be seperated out, has been (users, groups, sessions, filesystem access, database access, caching, and about a hundred other things). However, there are three core functions that each application object must have, and this base class contains them. They are: Privileges: there are 8 methods dealing with this. The relationship of one object to another: there are 27 methods dealing with this, as you might have guessed, the relationships themselves are complex. It is not a 2d relationship The relationship of an object to a URL on a website somewhere: there are 5 methods dealing with this. In addition there are some "meta" responsibilities each application object must have available to it. For instance, there are methods to version the property data, there are methods to import and export the property data. These things must be contained in the object, because only the object knows what properties there are, and how to deal with them. The list goes on here too, as there are 8 other functional groupings of meta responsibilities on the object. I'm sure there were other ways to do this, but as I said before two requirements outweighed everything else by quite a bit. First was the need for subclass developers to have to write as little code as possible. Second was the need for speed. Also, redesigning the object at this point is not possible, because there are hundreds of subclasses already in existence, so any changes cannot alter the API at all. I know I can take the functional groupings of the "meta" functions and create classes out of them and then do multiple inheritance to get their methods into the base object, but there are three problems with that. The first is that it increases the size object tree, which slows down the application. The second is that no matter what I do, those objects cannot ever function independently, because they need to know too much about the data they manipulate. And third, some of the meta functions, like versioning, influences everything else, and therefore cannot truely be completely factored out of everything else. Anyway, I hope that explains a little bit further the problem. Thanks for listening. JT ~ Plain Black ph: 703-286-2525 ext. 810 fax: 312-264-5382 http://www.plainblack.com I reject your reality, and substitute my own. ~ Adam Savage From lembark at wrkhors.com Wed Aug 3 08:18:06 2005 From: lembark at wrkhors.com (Steven Lembark) Date: Wed, 03 Aug 2005 11:18:06 -0400 Subject: [Chicago-talk] super complex object In-Reply-To: References: Message-ID: -- JT Smith > See I've tried to move it to an MVC pattern, but I lose several points of > efficiency as well as making it slightly more complicated for developers > to put together subclasses of this class. You will nearly always see some performance hit with OO technology. The lookups and separation issues have an overhead. If you are that concernec with performance dump the OO (or only use however much of it as is necssary). I'd still bet you have glommed together multiple separate behaviors that might be better integrated via dispatch from elements within the main object than inheritence. Difference is foo->does_everything vs. foo->{net}->does_this; foo->{disk}->does_that; -- Steven Lembark 85-09 90th Street Workhorse Computing Woodhaven, NY 11421 lembark at wrkhors.com 1 888 359 3508 From lembark at wrkhors.com Thu Aug 4 06:25:41 2005 From: lembark at wrkhors.com (Steven Lembark) Date: Thu, 04 Aug 2005 09:25:41 -0400 Subject: [Chicago-talk] super complex object In-Reply-To: References: Message-ID: <68C65C7BEFEC8BF5EA29F269@[192.168.1.2]> > I know I can take the functional groupings of the "meta" functions and > create classes out of them and then do multiple inheritance to get their > methods into the base object, but there are three problems with that. > The first is that it increases the size object tree, which slows down > the application. The second is that no matter what I do, those objects > cannot ever function independently, because they need to know too much > about the data they manipulate. And third, some of the meta functions, > like versioning, influences everything else, and therefore cannot truely > be completely factored out of everything else. This is perl, not java: Classes Define Behavior. You do not need the class-from-hell just to have data sharing. The object contains data, but that does not mean your class structure has to be all in one place. There isn't any real performance hit from inheritence in Perl iff you don't manipulate the symbol table for the classes heavily. The dispatcher uses a hash lookup to resolve method calls that skips inheritence levels after the first lookup. Net resuilt is that you can decompose the whole thing into base classes without any real performance hit and at least give yourself some breathing room maintaining the internals. If a lot of classes need to add data into a central object look up NEXT::init, that is exactly what it's designed for. The derived class's constructor passes its new object through the inherited initializers to get a composite data structure (hash or array, I'm about to add hash-of-arrays). This can also be used to assemble fairly complicated data structures or dispatch tables. One approach to this situation is Tim Bunce's trick in DBI: use a local hash for metadata. In that case you have a lexical meta hash for the object within each class for its private stuff (destructor does a delete $meta{$obj}) and the shared portion lives in the object itself. That at least encapsulates what you consider public from any private data. This also protects the users if they want to store any of their own data in the object since they are less likely to overwrite something useful. -- Steven Lembark 85-09 90th Street Workhorse Computing Woodhaven, NY 11421 lembark at wrkhors.com 1 888 359 3508 From jt at plainblack.com Thu Aug 4 06:49:30 2005 From: jt at plainblack.com (JT Smith) Date: Thu, 04 Aug 2005 08:49:30 -0500 Subject: [Chicago-talk] super complex object In-Reply-To: <68C65C7BEFEC8BF5EA29F269@[192.168.1.2]> References: <68C65C7BEFEC8BF5EA29F269@[192.168.1.2]> Message-ID: > If a lot of classes need to add data into a > central object look up NEXT::init, that is > exactly what it's designed for. The derived > class's constructor passes its new object > through the inherited initializers to get a > composite data structure (hash or array, > I'm about to add hash-of-arrays). This can > also be used to assemble fairly complicated > data structures or dispatch tables. > > One approach to this situation is Tim Bunce's > trick in DBI: use a local hash for metadata. > In that case you have a lexical meta hash for > the object within each class for its private > stuff (destructor does a delete $meta{$obj}) > and the shared portion lives in the object > itself. That at least encapsulates what you > consider public from any private data. This > also protects the users if they want to store > any of their own data in the object since they > are less likely to overwrite something useful. I really wish I understood anything you just said. I read over the documentation for NEXT::init and still have no idea what it would be used for. I think it's the fact that I'm self taught so don't understand a lot of the terminology. Sorry for my ignorance. Anyway, Jim's mixin solution will work fine for my needs. Thanks for all your effort. I really do appreciate it. JT ~ Plain Black ph: 703-286-2525 ext. 810 fax: 312-264-5382 http://www.plainblack.com I reject your reality, and substitute my own. ~ Adam Savage From lembark at wrkhors.com Thu Aug 4 19:09:38 2005 From: lembark at wrkhors.com (Steven Lembark) Date: Thu, 04 Aug 2005 22:09:38 -0400 Subject: [Chicago-talk] super complex object In-Reply-To: References: <68C65C7BEFEC8BF5EA29F269@[192.168.1.2]> Message-ID: > I really wish I understood anything you just said. I read over the > documentation for NEXT::init and still have no idea what it would be > used for. I think it's the fact that I'm self taught so don't understand > a lot of the terminology. Sorry for my ignorance. Say you want to have five classes that share data. One way is to have them all stuff data into a single object; problem there is the object gets bulky and you get collisions between various uses of obvious names. Alternative is to have a metadata hash in each class' package that is used to hold data for objects that the class has seen. You start out with: my %meta = (); as you see an object that the class cares about you can: my $obj = shift; $meta{ $obj } = { @$default_meta }; The trick here is that any object has a unique stringified version. Tim Bunce uses this for DBI: the $dbh handed back by DBI->connect( ... ) is an empty hash. This never fails to freak out a few people per week on the DBI mailing list. You don't see the stuff he manages with DBI. Instead of using my $foo = $obj->{foo}; he uses: my $objmeta = $meta{ $obj } ||= { @default_meta }; my $foo = $objmeta->{ foo }; which keeps the metaadata private to the DBI class and its minions. If you have a huge object then you could probably use this technique -- along with multiple inheritence -- to sequestedr the private information for each base class in a private are where they don't collide. If you snag a copy of Perl Best Pratices it goes over how to do this -- with working examples. Any performance hit you'll see from this technique is on the order of microseconds per call; which shouldn't be painful for anthing more recent thatn an x486... -- Steven Lembark 85-09 90th Street Workhorse Computing Woodhaven, NY 11421 lembark at wrkhors.com 1 888 359 3508 From jt at plainblack.com Fri Aug 5 06:45:46 2005 From: jt at plainblack.com (JT Smith) Date: Fri, 05 Aug 2005 08:45:46 -0500 Subject: [Chicago-talk] super complex object In-Reply-To: References: <68C65C7BEFEC8BF5EA29F269@[192.168.1.2]> Message-ID: > If you snag a copy of Perl Best Pratices it goes > over how to do this -- with working examples. I do have a copy of this book that I just haven't gotten around to reading yet. Thanks for taking the time to explain. I'll check it out. JT ~ Plain Black ph: 703-286-2525 ext. 810 fax: 312-264-5382 http://www.plainblack.com I reject your reality, and substitute my own. ~ Adam Savage From lembark at wrkhors.com Fri Aug 5 07:55:33 2005 From: lembark at wrkhors.com (Steven Lembark) Date: Fri, 05 Aug 2005 10:55:33 -0400 Subject: [Chicago-talk] super complex object In-Reply-To: References: <68C65C7BEFEC8BF5EA29F269@[192.168.1.2]> Message-ID: <8E67731D2228D0EBC51BB8F6@[192.168.1.2]> -- JT Smith >> If you snag a copy of Perl Best Pratices it goes >> over how to do this -- with working examples. > > I do have a copy of this book that I just haven't gotten around to > reading yet. Thanks for taking the time to explain. I'll check it out. This is what Damian calls an "Inside out class". Whatever wierd name he picked for it, the idea works rather nicely. -- Steven Lembark 85-09 90th Street Workhorse Computing Woodhaven, NY 11421 lembark at wrkhors.com 1 888 359 3508 From andy at petdance.com Sun Aug 7 22:10:10 2005 From: andy at petdance.com (Andy Lester) Date: Mon, 8 Aug 2005 00:10:10 -0500 Subject: [Chicago-talk] Lightning talk recap Message-ID: I'm glad that Geoff liked my two lightning talks, but our other Chicago PMer at OSCON, Liz Cortell, gets the "coolest talk" nod. http://www.onlamp.com/pub/wlg/7539 xoxo, Andy -- Andy Lester => andy at petdance.com => www.petdance.com => AIM:petdance From joshua.mcadams at gmail.com Mon Aug 8 13:40:29 2005 From: joshua.mcadams at gmail.com (Joshua McAdams) Date: Mon, 8 Aug 2005 15:40:29 -0500 Subject: [Chicago-talk] Meetings Message-ID: <49d805d705080813406a480d4e@mail.gmail.com> I was checking out the website and it shows that you guys last had a meeting in May... what is the normal meeting schedule? or is there one? Josh From andy at petdance.com Mon Aug 8 13:41:51 2005 From: andy at petdance.com (Andy Lester) Date: Mon, 8 Aug 2005 15:41:51 -0500 Subject: [Chicago-talk] Meetings In-Reply-To: <49d805d705080813406a480d4e@mail.gmail.com> References: <49d805d705080813406a480d4e@mail.gmail.com> Message-ID: <20050808204151.GA17635@petdance.com> On Mon, Aug 08, 2005 at 03:40:29PM -0500, Joshua McAdams (joshua.mcadams at gmail.com) wrote: > I was checking out the website and it shows that you guys last had a > meeting in May... what is the normal meeting schedule? or is there > one? We don't have a regular meeting place. Right now they happen as we can make them happen when we find a space. xoxo, Andy -- Andy Lester => andy at petdance.com => www.petdance.com => AIM:petdance From joshua.mcadams at gmail.com Mon Aug 8 13:44:15 2005 From: joshua.mcadams at gmail.com (Joshua McAdams) Date: Mon, 8 Aug 2005 15:44:15 -0500 Subject: [Chicago-talk] Meetings In-Reply-To: <20050808204151.GA17635@petdance.com> References: <49d805d705080813406a480d4e@mail.gmail.com> <20050808204151.GA17635@petdance.com> Message-ID: <49d805d70508081344fa39365@mail.gmail.com> What type of space do you need? My apartment has a common area that I can reserve... might could even pipe my wireless connection down there. On 8/8/05, Andy Lester wrote: > On Mon, Aug 08, 2005 at 03:40:29PM -0500, Joshua McAdams (joshua.mcadams at gmail.com) wrote: > > I was checking out the website and it shows that you guys last had a > > meeting in May... what is the normal meeting schedule? or is there > > one? > > We don't have a regular meeting place. Right now they happen as we can > make them happen when we find a space. > > xoxo, > Andy > > -- > Andy Lester => andy at petdance.com => www.petdance.com => AIM:petdance > _______________________________________________ > Chicago-talk mailing list > Chicago-talk at pm.org > http://mail.pm.org/mailman/listinfo/chicago-talk > From andy at petdance.com Mon Aug 8 13:54:47 2005 From: andy at petdance.com (Andy Lester) Date: Mon, 8 Aug 2005 15:54:47 -0500 Subject: [Chicago-talk] Meetings In-Reply-To: <49d805d70508081344fa39365@mail.gmail.com> References: <49d805d705080813406a480d4e@mail.gmail.com> <20050808204151.GA17635@petdance.com> <49d805d70508081344fa39365@mail.gmail.com> Message-ID: <20050808205447.GB17635@petdance.com> On Mon, Aug 08, 2005 at 03:44:15PM -0500, Joshua McAdams (joshua.mcadams at gmail.com) wrote: > What type of space do you need? My apartment has a common area that I > can reserve... might could even pipe my wireless connection down > there. We need: 1) Space and seating for 20+ geeks 2) An LCD projector That's about it. -- Andy Lester => andy at petdance.com => www.petdance.com => AIM:petdance From ehs at pobox.com Mon Aug 8 14:02:44 2005 From: ehs at pobox.com (Edward Summers) Date: Mon, 8 Aug 2005 16:02:44 -0500 Subject: [Chicago-talk] Meetings In-Reply-To: <49d805d705080813406a480d4e@mail.gmail.com> References: <49d805d705080813406a480d4e@mail.gmail.com> Message-ID: Dunno, but I did notice that brian d foy is talking at uniforum tomorrow night about testing, and has some books to give away... http://www.uniforum.chi.il.us/meetings/perltesting.html From jason at multiply.org Mon Aug 8 14:21:21 2005 From: jason at multiply.org (jason@multiply.org) Date: Mon, 8 Aug 2005 16:21:21 -0500 Subject: [Chicago-talk] Meetings In-Reply-To: References: <49d805d705080813406a480d4e@mail.gmail.com> Message-ID: <20050808162121.z6zh63a17xfokcw4@manage.multiply.org> Quoting Edward Summers : > Dunno, but I did notice that brian d foy is talking at uniforum > tomorrow night about testing, and has some books to give away... > > http://www.uniforum.chi.il.us/meetings/perltesting.html > _______________________________________________ > Chicago-talk mailing list > Chicago-talk at pm.org > http://mail.pm.org/mailman/listinfo/chicago-talk > the room we had our last meeting in is being used for Training at my company at the moment, but when it frees up, we will probably be able to have something mid september or early october. I had asked brian if he wanted to speak earlier in the year, but his schedule didn't permit it. I liked our last lightning talk + presentation format, so why don't we throw out ideas for things small and big and we can ask brian if he is sitll interested. -jason scott gessner jason at multiply.org From thomasoniii at gmail.com Mon Aug 8 14:24:23 2005 From: thomasoniii at gmail.com (Jim Thomason) Date: Mon, 8 Aug 2005 16:24:23 -0500 Subject: [Chicago-talk] Meetings In-Reply-To: <20050808205447.GB17635@petdance.com> References: <49d805d705080813406a480d4e@mail.gmail.com> <20050808204151.GA17635@petdance.com> <49d805d70508081344fa39365@mail.gmail.com> <20050808205447.GB17635@petdance.com> Message-ID: <5cfdfaf7050808142474a9ff08@mail.gmail.com> Edison Schools (my employer) would be willing to pony up meeting space, if we'd like. So we could cram into the conference room. We've even got a projector. I think I need to confirm with the building, though, to make sure they wouldn't get concerned about the shaggy people showing up in the evening. The only caveat is space - it's just a conference room, and we can barely fit everyone in our office into it at the moment. 16 or so people is a tight fit. We may be able to fit some more than that in, but it's not ideal. Depending upon anticipated turnout, this may or may not be okay. Located in beautiful Skokie right across the street from Old Orchard Mall. -Jim..... On 8/8/05, Andy Lester wrote: > On Mon, Aug 08, 2005 at 03:44:15PM -0500, Joshua McAdams (joshua.mcadams at gmail.com) wrote: > > What type of space do you need? My apartment has a common area that I > > can reserve... might could even pipe my wireless connection down > > there. > > We need: > > 1) Space and seating for 20+ geeks > 2) An LCD projector > > That's about it. > > -- > Andy Lester => andy at petdance.com => www.petdance.com => AIM:petdance > _______________________________________________ > Chicago-talk mailing list > Chicago-talk at pm.org > http://mail.pm.org/mailman/listinfo/chicago-talk > From joshua.mcadams at gmail.com Mon Aug 8 15:29:07 2005 From: joshua.mcadams at gmail.com (Joshua McAdams) Date: Mon, 8 Aug 2005 17:29:07 -0500 Subject: [Chicago-talk] Meetings In-Reply-To: <5cfdfaf7050808142474a9ff08@mail.gmail.com> References: <49d805d705080813406a480d4e@mail.gmail.com> <20050808204151.GA17635@petdance.com> <49d805d70508081344fa39365@mail.gmail.com> <20050808205447.GB17635@petdance.com> <5cfdfaf7050808142474a9ff08@mail.gmail.com> Message-ID: <49d805d705080815292ed0e4ee@mail.gmail.com> If someone has a projector, the common room in my building is reserveable just about any time and will hold well over 20 geeks. Any of the other locations sound fine too. Basically, I'm just excited to finally be living somewhere with a pm group :) On 8/8/05, Jim Thomason wrote: > Edison Schools (my employer) would be willing to pony up meeting > space, if we'd like. So we could cram into the conference room. We've > even got a projector. I think I need to confirm with the building, > though, to make sure they wouldn't get concerned about the shaggy > people showing up in the evening. > > The only caveat is space - it's just a conference room, and we can > barely fit everyone in our office into it at the moment. 16 or so > people is a tight fit. We may be able to fit some more than that in, > but it's not ideal. Depending upon anticipated turnout, this may or > may not be okay. > > Located in beautiful Skokie right across the street from Old Orchard Mall. > > > -Jim..... > > On 8/8/05, Andy Lester wrote: > > On Mon, Aug 08, 2005 at 03:44:15PM -0500, Joshua McAdams (joshua.mcadams at gmail.com) wrote: > > > What type of space do you need? My apartment has a common area that I > > > can reserve... might could even pipe my wireless connection down > > > there. > > > > We need: > > > > 1) Space and seating for 20+ geeks > > 2) An LCD projector > > > > That's about it. > > > > -- > > Andy Lester => andy at petdance.com => www.petdance.com => AIM:petdance > > _______________________________________________ > > Chicago-talk mailing list > > Chicago-talk at pm.org > > http://mail.pm.org/mailman/listinfo/chicago-talk > > > _______________________________________________ > Chicago-talk mailing list > Chicago-talk at pm.org > http://mail.pm.org/mailman/listinfo/chicago-talk > From andy at petdance.com Mon Aug 8 15:31:46 2005 From: andy at petdance.com (Andy Lester) Date: Mon, 8 Aug 2005 17:31:46 -0500 Subject: [Chicago-talk] Meetings In-Reply-To: <49d805d705080815292ed0e4ee@mail.gmail.com> References: <49d805d705080813406a480d4e@mail.gmail.com> <20050808204151.GA17635@petdance.com> <49d805d70508081344fa39365@mail.gmail.com> <20050808205447.GB17635@petdance.com> <5cfdfaf7050808142474a9ff08@mail.gmail.com> <49d805d705080815292ed0e4ee@mail.gmail.com> Message-ID: <20050808223146.GD17635@petdance.com> On Mon, Aug 08, 2005 at 05:29:07PM -0500, Joshua McAdams (joshua.mcadams at gmail.com) wrote: > If someone has a projector, the common room in my building is > reserveable just about any time and will hold well over 20 geeks. Any > of the other locations sound fine too. Basically, I'm just excited to > finally be living somewhere with a pm group :) Yeah, it's the projector that's the big problem. :-) Otherwise, we could use just about ANY space. -- Andy Lester => andy at petdance.com => www.petdance.com => AIM:petdance From jt at plainblack.com Mon Aug 8 16:53:57 2005 From: jt at plainblack.com (JT Smith) Date: Mon, 08 Aug 2005 18:53:57 -0500 Subject: [Chicago-talk] Meetings In-Reply-To: <49d805d705080815292ed0e4ee@mail.gmail.com> References: <49d805d705080813406a480d4e@mail.gmail.com> <20050808204151.GA17635@petdance.com> <49d805d70508081344fa39365@mail.gmail.com> <20050808205447.GB17635@petdance.com> <5cfdfaf7050808142474a9ff08@mail.gmail.com> <49d805d705080815292ed0e4ee@mail.gmail.com> Message-ID: I have a 2000 lumen portable projector that's pretty nice. I'm willing to bring it when I come to meetings, but I can't guarantee I can be at all of them because I travel a lot. On Mon, 8 Aug 2005 17:29:07 -0500 Joshua McAdams wrote: > If someone has a projector, the common room in my building is > reserveable just about any time and will hold well over 20 geeks. Any > of the other locations sound fine too. Basically, I'm just excited to > finally be living somewhere with a pm group :) > > On 8/8/05, Jim Thomason wrote: >> Edison Schools (my employer) would be willing to pony up meeting >> space, if we'd like. So we could cram into the conference room. We've >> even got a projector. I think I need to confirm with the building, >> though, to make sure they wouldn't get concerned about the shaggy >> people showing up in the evening. >> >> The only caveat is space - it's just a conference room, and we can >> barely fit everyone in our office into it at the moment. 16 or so >> people is a tight fit. We may be able to fit some more than that in, >> but it's not ideal. Depending upon anticipated turnout, this may or >> may not be okay. >> >> Located in beautiful Skokie right across the street from Old Orchard Mall. >> >> >> -Jim..... >> >> On 8/8/05, Andy Lester wrote: >> > On Mon, Aug 08, 2005 at 03:44:15PM -0500, Joshua McAdams (joshua.mcadams at gmail.com) >>wrote: >> > > What type of space do you need? My apartment has a common area that I >> > > can reserve... might could even pipe my wireless connection down >> > > there. >> > >> > We need: >> > >> > 1) Space and seating for 20+ geeks >> > 2) An LCD projector >> > >> > That's about it. >> > >> > -- >> > Andy Lester => andy at petdance.com => www.petdance.com => AIM:petdance >> > _______________________________________________ >> > Chicago-talk mailing list >> > Chicago-talk at pm.org >> > http://mail.pm.org/mailman/listinfo/chicago-talk >> > >> _______________________________________________ >> Chicago-talk mailing list >> Chicago-talk at pm.org >> http://mail.pm.org/mailman/listinfo/chicago-talk >> > _______________________________________________ > Chicago-talk mailing list > Chicago-talk at pm.org > http://mail.pm.org/mailman/listinfo/chicago-talk JT ~ Plain Black ph: 703-286-2525 ext. 810 fax: 312-264-5382 http://www.plainblack.com I reject your reality, and substitute my own. ~ Adam Savage From frag at ripco.com Tue Aug 9 10:24:35 2005 From: frag at ripco.com (Mike Fragassi) Date: Tue, 9 Aug 2005 12:24:35 -0500 (CDT) Subject: [Chicago-talk] Meetings In-Reply-To: <20050808223146.GD17635@petdance.com> References: <49d805d705080813406a480d4e@mail.gmail.com> <20050808204151.GA17635@petdance.com> <49d805d70508081344fa39365@mail.gmail.com> <20050808205447.GB17635@petdance.com> <5cfdfaf7050808142474a9ff08@mail.gmail.com> <49d805d705080815292ed0e4ee@mail.gmail.com> <20050808223146.GD17635@petdance.com> Message-ID: On Mon, 8 Aug 2005, Andy Lester wrote: > Yeah, it's the projector that's the big problem. :-) Here's one possible solution: http://www6.tomshardware.com/howto/20041113/index.html Anyone got an old overhead projector? -- Mike F. From scstarkey at gmail.com Tue Aug 9 10:57:29 2005 From: scstarkey at gmail.com (Stephen Starkey) Date: Tue, 9 Aug 2005 12:57:29 -0500 Subject: [Chicago-talk] MIME Decoder? Message-ID: <4e6bcc2e05080910572c87a41a@mail.gmail.com> Hey all, Does anyone know of a good MIME Decoder package? I'm writing a tool that stores emails into a database and needs to extract the text contents out no matter what format it's in. However, the MIME::Decoder package doesn't seem to be able to extract any contents out, no matter how I send the content into it. Another note: all the libraries I've been trying have had a bent toward decoding to disk, but I need to do everything in-memory. Thanks for everybody's help! Stephen Starkey. From wiggins at danconia.org Tue Aug 9 11:48:11 2005 From: wiggins at danconia.org (Wiggins d'Anconia) Date: Tue, 09 Aug 2005 12:48:11 -0600 Subject: [Chicago-talk] MIME Decoder? In-Reply-To: <4e6bcc2e05080910572c87a41a@mail.gmail.com> References: <4e6bcc2e05080910572c87a41a@mail.gmail.com> Message-ID: <42F8FA6B.9030508@danconia.org> Stephen Starkey wrote: > Hey all, > > Does anyone know of a good MIME Decoder package? I'm writing a tool > that stores emails into a database and needs to extract the text > contents out no matter what format it's in. However, the > MIME::Decoder package doesn't seem to be able to extract any contents > out, no matter how I send the content into it. Another note: all the > libraries I've been trying have had a bent toward decoding to disk, > but I need to do everything in-memory. > > Thanks for everybody's help! > > Stephen Starkey. The Mail::Box suite of mail handling modules can do just about anything with mail messages (at least that I have seen), though it has a fairly steep learning curve. There has been talk on the mailing list of having it use a DB storage as well, though I am not aware of the existence of such as yet. HTH, http://danconia.org From gdf at speakeasy.net Tue Aug 9 13:36:36 2005 From: gdf at speakeasy.net (Greg Fast) Date: Tue, 9 Aug 2005 15:36:36 -0500 Subject: [Chicago-talk] MIME Decoder? In-Reply-To: <4e6bcc2e05080910572c87a41a@mail.gmail.com> References: <4e6bcc2e05080910572c87a41a@mail.gmail.com> Message-ID: <20050809153636.A25347@speakeasy.net> On Tue, Aug 09, 2005 at 12:57:29PM -0500, Stephen Starkey wrote: > Does anyone know of a good MIME Decoder package? I'm writing a tool > that stores emails into a database and needs to extract the text > contents out no matter what format it's in. However, the > MIME::Decoder package doesn't seem to be able to extract any contents > out, no matter how I send the content into it. Another note: all the > libraries I've been trying have had a bent toward decoding to disk, > but I need to do everything in-memory. Wouldn't you want to use MIME::Parser rather than MIME::Deocder directly? It's been a while since I looked at it, but I believe you can subclass MIME::Pareser::Filer such that MIME::Parser extracts parts into memory. I recall Filer being one of the more annoying bits of MIME::Tools, but it's a pretty complete library. -- Greg Fast gdf at speakeasy.net http://cken.chi.groogroo.com/ From ehs at pobox.com Tue Aug 9 13:48:05 2005 From: ehs at pobox.com (Edward Summers) Date: Tue, 9 Aug 2005 15:48:05 -0500 Subject: [Chicago-talk] MIME Decoder? In-Reply-To: <20050809153636.A25347@speakeasy.net> References: <4e6bcc2e05080910572c87a41a@mail.gmail.com> <20050809153636.A25347@speakeasy.net> Message-ID: <6F1C0953-ABC9-42C6-B4ED-E3ED50088982@pobox.com> > Does anyone know of a good MIME Decoder package? Simon Cozen's Email::Simple [1] looks like it could be pretty handy for this: my $mail = Email::Simple->new($text); my $body = $mail->body; And it actually has some good ratings, which is encouraging :-) //Ed [1] http://search.cpan.org/dist/Email-Simple From comdog at panix.com Tue Aug 9 13:58:30 2005 From: comdog at panix.com (brian d foy) Date: Tue, 9 Aug 2005 16:58:30 -0400 (EDT) Subject: [Chicago-talk] I'm at Uniforum tonight Message-ID: At 7pm I'll be saying something about testing. Don't ask what because I won't know until then. :) http://www.uniforum.chi.il.us/meetings/perltesting.html -- brian d foy From jperkins at sneer.org Tue Aug 16 08:00:44 2005 From: jperkins at sneer.org (Jason Perkins) Date: Tue, 16 Aug 2005 10:00:44 -0500 Subject: [Chicago-talk] folding multiple newlines at eof Message-ID: I'm attempting to convert runs of multiple newlines at the end of files into a single newline. The following one liner is converting all runs of newlines throughout the file to a single newline: find . -name '*.php' -exec perl -00 -pi -e 's/\n{2,}$/\n/s' {} \; Can anyone suggest a means of correcting the behaviour? Explanations with your fix even more greatly appreciated so that I can figure this out on my own next time. thanks! -- Jason Perkins jperkins at sneer.org "The computer allows you to make mistakes faster than any other invention, with the possible exception of handguns and tequila." From briank at kappacs.com Tue Aug 16 08:16:46 2005 From: briank at kappacs.com (Brian Katzung) Date: Tue, 16 Aug 2005 10:16:46 -0500 Subject: [Chicago-talk] folding multiple newlines at eof In-Reply-To: References: Message-ID: <4302035E.3080204@kappacs.com> Jason Perkins wrote: > I'm attempting to convert runs of multiple newlines at the end of > files into a single newline. The following one liner is converting > all runs of newlines throughout the file to a single newline: > > find . -name '*.php' -exec perl -00 -pi -e 's/\n{2,}$/\n/s' {} \; > > Can anyone suggest a means of correcting the behaviour? Explanations > with your fix even more greatly appreciated so that I can figure this > out on my own next time. find . -name '*.php' -exec perl -0777 -pi -e 's/\n{2,}$/\n/s' {} \; Explanation: -00 slurps paragraphs; -0777 slurps files. See -0 option in man perlrun. - Brian From lembark at wrkhors.com Tue Aug 16 10:19:37 2005 From: lembark at wrkhors.com (Steven Lembark) Date: Tue, 16 Aug 2005 13:19:37 -0400 Subject: [Chicago-talk] folding multiple newlines at eof Message-ID: <1ACDD0952EE6E2B4A06AADCF@[192.168.200.5]> -- Jason Perkins > I'm attempting to convert runs of multiple newlines at the end of > files into a single newline. The following one liner is converting > all runs of newlines throughout the file to a single newline: > > find . -name '*.php' -exec perl -00 -pi -e 's/\n{2,}$/\n/s' {} \; > > Can anyone suggest a means of correcting the behaviour? Explanations > with your fix even more greatly appreciated so that I can figure this > out on my own next time. slurp the file and zap the newlines at EOL: #!/path/to/perl -p BEGIN { undef $/ }; s/\n+\Z//; or, if you prefer { local $/; my $string = <$ARGV>; $string =~ s{ \n+ \Z}{}x; print $string; } (someone else'll have to remember what use English does to $/... :-). Both ^ and $ are designed to apply mutlple times within a string and locate themselves based on embedded newlines. The \A and \Z meta char's are zero-width and only apply at the start and end of the entire string. By anchoring a search for newlines at the end-of-string (vs. end-of- line) you'll strip only the trailing newlines. Damian suggests in PBP using only \A and \Z, dropping ^ and $ entirely, becuase people make the mis-assumption about EOL and EOS too frequently. -- Steven Lembark 85-09 90th Street Workhorse Computing Woodhaven, NY 11421 lembark at wrkhors.com 1 888 359 3508 From jt at plainblack.com Tue Aug 23 07:15:24 2005 From: jt at plainblack.com (JT Smith) Date: Tue, 23 Aug 2005 09:15:24 -0500 Subject: [Chicago-talk] lowercase package names Message-ID: I know that generally speaking lowercase package names are supposed to be reserved for internal perl stuff, but I have a need to use them and I'm wondering if there's any code within perl that would prevent it. Anybody know? And if so, is there any way to disable that check? JT ~ Plain Black ph: 703-286-2525 ext. 810 fax: 312-264-5382 http://www.plainblack.com I reject your reality, and substitute my own. ~ Adam Savage From thomasoniii at gmail.com Tue Aug 23 07:22:48 2005 From: thomasoniii at gmail.com (Jim Thomason) Date: Tue, 23 Aug 2005 09:22:48 -0500 Subject: [Chicago-talk] lowercase package names In-Reply-To: References: Message-ID: <5cfdfaf70508230722488ca14c@mail.gmail.com> Okay, you piqued my curiousity. Care to share why you need a lowercased package name? AFAIK, lowercase package names are pragmas by convention, but (like damn near everything else in the language) isn't actually enforced in any fashion. Nor is there anything necessarily special about them. For example, the 'vars' pragma. Nothing magical in there at all. -Jim..... On 8/23/05, JT Smith wrote: > I know that generally speaking lowercase package names are supposed to be reserved for > internal perl stuff, but I have a need to use them and I'm wondering if there's any code > within perl that would prevent it. Anybody know? > > And if so, is there any way to disable that check? > > > JT ~ Plain Black > ph: 703-286-2525 ext. 810 > fax: 312-264-5382 > http://www.plainblack.com > > I reject your reality, and substitute my own. ~ Adam Savage > _______________________________________________ > Chicago-talk mailing list > Chicago-talk at pm.org > http://mail.pm.org/mailman/listinfo/chicago-talk > From andy at petdance.com Tue Aug 23 07:24:38 2005 From: andy at petdance.com (Andy Lester) Date: Tue, 23 Aug 2005 09:24:38 -0500 Subject: [Chicago-talk] lowercase package names In-Reply-To: References: Message-ID: <20050823142438.GA11640@petdance.com> On Tue, Aug 23, 2005 at 09:15:24AM -0500, JT Smith (jt at plainblack.com) wrote: > I know that generally speaking lowercase package names are supposed to be reserved for > internal perl stuff, but I have a need to use them and I'm wondering if there's any code > within perl that would prevent it. Anybody know? More specifically, they're for pragmas, not just Perl internals. But no, nothing stops you from doing this. xoxo, Andy -- Andy Lester => andy at petdance.com => www.petdance.com => AIM:petdance From ehs at pobox.com Tue Aug 23 07:29:04 2005 From: ehs at pobox.com (Edward Summers) Date: Tue, 23 Aug 2005 09:29:04 -0500 Subject: [Chicago-talk] lowercase package names In-Reply-To: References: Message-ID: On Aug 23, 2005, at 9:15 AM, JT Smith wrote: > I know that generally speaking lowercase package names are supposed > to be reserved for > internal perl stuff, but I have a need to use them and I'm > wondering if there's any code > within perl that would prevent it. Anybody know? That sounds like a good idea for an Acme module, enforcing package name conventions :-) package jt; sub foo { 'bar' } print jt::foo(); //Ed From jt at plainblack.com Tue Aug 23 07:45:23 2005 From: jt at plainblack.com (JT Smith) Date: Tue, 23 Aug 2005 09:45:23 -0500 Subject: [Chicago-talk] lowercase package names In-Reply-To: <5cfdfaf70508230722488ca14c@mail.gmail.com> References: <5cfdfaf70508230722488ca14c@mail.gmail.com> Message-ID: I have news. They are actually enforced in perl, at least partially. The weird thing is that it does seem to work sometimes, but not always. For instance, if I did something like: package MyModule; use base 'Foo::bar'; my $self = Foo::bar->new; But if I want to use another lowercase module it doesn't work. package MyModule; use base 'Foo::bar'; use Foo::bar2; my $foo = Foo::bar->new; my $bar = Foo::bar2->new; Likewise it doesn't appear to work if you use multiple inheritance like: package MyModule; use base qw(Foo::bar Foo::bar2); my $foo = Foo::bar->new; my $bar = Foo::bar2->new; Anyway, I'm trying to pull off a bit of a jury rig to maintain backward compatibility. I had a package that I decided would be better split into lots of small packages as subclassed objects. So I was turning the individual methods into package names and using AUTOLOAD to redirect method calls to these individual packages. Since the methods are lower case it made it easy to use lower case package names. But I can quite easily uppercase the first letter in the AUTOLOAD to make it use upper case package names. It's just one more extra step. On Tue, 23 Aug 2005 09:22:48 -0500 Jim Thomason wrote: > Okay, you piqued my curiousity. Care to share why you need a > lowercased package name? > > AFAIK, lowercase package names are pragmas by convention, but (like > damn near everything else in the language) isn't actually enforced in > any fashion. > > Nor is there anything necessarily special about them. For example, the > 'vars' pragma. Nothing magical in there at all. > > -Jim..... > > On 8/23/05, JT Smith wrote: >> I know that generally speaking lowercase package names are supposed to be reserved for >> internal perl stuff, but I have a need to use them and I'm wondering if there's any >>code >> within perl that would prevent it. Anybody know? >> >> And if so, is there any way to disable that check? >> >> >> JT ~ Plain Black >> ph: 703-286-2525 ext. 810 >> fax: 312-264-5382 >> http://www.plainblack.com >> >> I reject your reality, and substitute my own. ~ Adam Savage >> _______________________________________________ >> Chicago-talk mailing list >> Chicago-talk at pm.org >> http://mail.pm.org/mailman/listinfo/chicago-talk >> > _______________________________________________ > Chicago-talk mailing list > Chicago-talk at pm.org > http://mail.pm.org/mailman/listinfo/chicago-talk JT ~ Plain Black ph: 703-286-2525 ext. 810 fax: 312-264-5382 http://www.plainblack.com I reject your reality, and substitute my own. ~ Adam Savage From lembark at wrkhors.com Wed Aug 24 04:51:54 2005 From: lembark at wrkhors.com (Steven Lembark) Date: Wed, 24 Aug 2005 07:51:54 -0400 Subject: [Chicago-talk] lowercase package names In-Reply-To: <5cfdfaf70508230722488ca14c@mail.gmail.com> References: <5cfdfaf70508230722488ca14c@mail.gmail.com> Message-ID: -- Jim Thomason > Okay, you piqued my curiousity. Care to share why you need a > lowercased package name? > > AFAIK, lowercase package names are pragmas by convention, but (like > damn near everything else in the language) isn't actually enforced in > any fashion. Convention onl. The restriction on package names is __PACKAGE__ =~ /^\w+$/; and the module has to be named __PACKAGE__ . '.pm' for loading via require. -- Steven Lembark 85-09 90th Street Workhorse Computing Woodhaven, NY 11421 lembark at wrkhors.com 1 888 359 3508