On Thursday 23 October 2008 20:18:49 Jess Robinson wrote: > On Tue, 21 Oct 2008, jackal wrote: > > This is proposal for a filtering component, similar to > > DBIx::Class::InflateColumn > > It can -modify- columns transparently. When you read column - it > > inflates, when you write - deflates. > > On creating a new column, whole cycle passed - deflating for DB and > > inflating for usage. > > Module can handle scalars, because of it's destination - to modify data. > > I think I see where you are going, but can you give some actual examples > with data, how to use it etc? > > Someone did start/implement a ::Filter module, but I'm not sure where that > went or why it disappeared.. That one was *just* for scalar to scalar > though.
One example is in a module documentation: package DB::Test; use String::Util ':all'; __PACKAGE__->modify_column('html', { inflate => sub { htmlesc(shift) }, # escaping html entities deflate => sub { crunch(shift); } # removing extra whitespaces }); in a script: $r = $schema->resultset('Test')->create({html => ' a & b '}); # it will be deflated into DB as 'a & b' $r->html; # inflated as 'a & b' $r->html(' c & d '); # deflated into DB as 'c & d' $r->update; $r->html; # inflated as 'c & b' Here you must send data without html entities, but if you use data in your html templates only and you don't want to modify data in controllers - you shouldn't worry about this, because browsers will decode html entities by themselves. There's another example: package DB::Test; use String::Util ':all'; __PACKAGE__->modify_column('homepage', { inflate => sub { $_[0] }, # as is deflate => sub { my $value = trim(shift); if ($value !~ m!^([a-z]+://)?[a-z0-9\-\.]+([\/\?].*)?$!si) { $value = undef; } else { $value .= '/' if ($value =~ m!^([a-z]+://)?[a-z0-9\-\.]+$!si); $value = 'http://'.$value if ($value !~ m!^[a-z]+://!si); } return $value; } }); in a script: $r = $schema->resultset('Test')->create({homepage => ' site.ru '}); # it will be deflated into DB as 'http://site.ru/' $r->homepage; # inflated as 'http://site.ru/' (as is) $r->homepage('ftp://site.ru '); # deflated into DB as 'ftp://site.ru/' $r->update; $r->homepage; # inflated as 'ftp://site.ru/' (as is) > > > Module can works together with InflateColumn: > > __PACKAGE__->modify_column('passw', ...); > > __PACKAGE__->inflate_column('passw', ...); > > > > In that case, when you read - it inflates into object by InflateColumn, > > then object will be modified by ModifyColumn. When wou write - there's > > reverse process. > > Again, examples? ;) There's example of using module with InflateColumn: package DB::Test; use URI; __PACKAGE__->inflate_column('homepage', { inflate => sub { URI->new($_[0]) }, deflate => sub { shift->as_string } }); __PACKAGE__->modify_column('homepage', { inflate => sub { $_[0] }, # as is deflate => sub { shift->canonical } # normalize }); in a script: # it will be deflated into canonical version by ModifyColumn, then deflated into scalar by InflateColumn $r = $schema->resultset('Test')->create({homepage => URI->new('HTTP://WWW.perl.com:80')}); # deflated into DB as 'http://www.perl.com/' # it will be inflated into URI object by InflateColumn, then it can be modified by ModifyColumn (vice-versa) $r->homepage->as_string; # inflated as 'http://www.perl.com/' (as is) > > Jess -- Kind regards, Eugeny. _______________________________________________ List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class IRC: irc.perl.org#dbix-class SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/ Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk