NAME
Fey::ORM::Policy - Declarative policies for Fey::ORM using classes
VERSION
version 0.41
SYNOPSIS
package
MyApp::Policy;
use
strict;
use
warnings;
use
Fey::ORM::Policy;
transform_all
matching {
$_
[0]->type() eq
'date'
}
=> inflate {
return
unless
defined
$_
[1];
return
DateTime::Format::Pg->parse_date(
$_
[1] ) }
=> deflate {
defined
$_
[1] &&
ref
$_
[1]
? DateTime::Format::Pg->format_date(
$_
[1] )
:
$_
[1] };
transform_all
matching {
$_
[0]->name() eq
'email_address'
}
=> inflate {
return
unless
defined
$_
[1];
return
Email::Address->parse(
$_
[1] ) }
=> deflate {
defined
$_
[1] &&
ref
$_
[1]
? Email::Address->as_string
:
$_
[1] };
has_one_namer {
my
$name
=
$_
[0]->name();
my
@parts
=
map
{
lc
} (
$name
=~ /([A-Z][a-z]+)/g );
return
join
q{_}
,
@parts
; };
has_many_namer {
my
$name
=
$_
[0]->name();
my
@parts
=
map
{
lc
} (
$name
=~ /([A-Z][a-z]+)/g );
$parts
[-1] = PL_N(
$parts
[-1] );
return
join
q{_}
,
@parts
; };
package
User;
use
Fey::ORM::Table;
has_policy
'MyApp::Policy'
;
has_table ...;
DESCRIPTION
This module allows you to declare a policy for your Fey::ORM::Table-using classes.
A policy can define transform rules which can be applied to matching columns, as well as a naming scheme for has_one and has_many methods. This allows you to spare yourself some drudgery, and allows you to consolidate decisions (like "all date type columns return a DateTime
object") in a single place.
FUNCTIONS
This module exports a bunch of sugar functions into your namespace so you can define your policy in a declarative manner:
transform_all
This should be followed by a matching
sub reference, and one of an inflate
or deflate
sub.
matching { ... }
This function takes a subroutine reference that will be called and passed a Fey::Column object as its argument. This sub should look at the column and return true if the associated inflate/deflate should be applied to the column.
Note that the matching subs are checked in the order they are defined by transform_all()
, and the first one wins.
inflate { ... }
An inflator sub for the associated transform. See Fey::ORM::Table for more details on transforms.
deflate { ... }
A deflator sub for the associated transform. See Fey::ORM::Table for more details on transforms.
has_one_namer { ... }
A subroutine reference which will be used to generate a name for has_one()
methods when a name is not explicitly provided.
This sub will receive the foreign table as its first argument, and the associate Fey::Meta::FK object as the second argument. In most cases, the foreign table will probably be sufficient to generate a name.
has_many_namer { ... }
Just like the has_one_namer()
, but is called for naming has_many()
methods.
Policy
This methods returns the Fey::Object::Policy object for your policy class. This method allows Fey::ORM::Table to go get a policy object from a policy class name.
AUTHOR
Dave Rolsky <autarch@urth.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2011 by Dave Rolsky.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.