Commit | Line | Data |
69ac22ee |
1 | package DBIx::Class::Serialize::Storable; |
ed28f830 |
2 | use strict; |
bf5ecff9 |
3 | use warnings; |
69ac22ee |
4 | use Storable; |
ed28f830 |
5 | |
6 | sub STORABLE_freeze { |
e60dc79f |
7 | my ($self, $cloning) = @_; |
ed28f830 |
8 | my $to_serialize = { %$self }; |
e60dc79f |
9 | |
7cfda9a6 |
10 | # The source is either derived from _source_handle or is |
11 | # reattached in the thaw handler below |
ed28f830 |
12 | delete $to_serialize->{result_source}; |
7cfda9a6 |
13 | |
14 | # If the parser is cached there is a chance that the interpeter |
15 | # which receives the ice will not have the parser loaded |
16 | # A re-determination will force an implicit load |
17 | delete $to_serialize->{__datetime_parser}; |
18 | |
19 | # Dynamic values, easy to recalculate |
20 | delete $to_serialize->{$_} for qw/related_resultsets _inflated_column/; |
e60dc79f |
21 | |
7244b45f |
22 | return (Storable::freeze($to_serialize)); |
ed28f830 |
23 | } |
24 | |
25 | sub STORABLE_thaw { |
7244b45f |
26 | my ($self, $cloning, $serialized) = @_; |
e60dc79f |
27 | |
7244b45f |
28 | %$self = %{ Storable::thaw($serialized) }; |
7cfda9a6 |
29 | |
30 | # if the handle went missing somehow, reattach |
24d67825 |
31 | $self->result_source($self->result_source_instance) |
7cfda9a6 |
32 | if !$self->_source_handle && $self->can('result_source_instance'); |
ed28f830 |
33 | } |
34 | |
19345968 |
35 | 1; |
36 | |
37 | __END__ |
38 | |
75d07914 |
39 | =head1 NAME |
19345968 |
40 | |
24d67825 |
41 | DBIx::Class::Serialize::Storable - hooks for Storable freeze/thaw |
19345968 |
42 | |
43 | =head1 SYNOPSIS |
44 | |
45 | # in a table class definition |
69ac22ee |
46 | __PACKAGE__->load_components(qw/Serialize::Storable/); |
9b83fccd |
47 | |
19345968 |
48 | # meanwhile, in a nearby piece of code |
24d67825 |
49 | my $cd = $schema->resultset('CD')->find(12); |
2053ab2a |
50 | # if the cache uses Storable, this will work automatically |
51 | $cache->set($cd->ID, $cd); |
19345968 |
52 | |
53 | =head1 DESCRIPTION |
54 | |
24d67825 |
55 | This component adds hooks for Storable so that row objects can be |
56 | serialized. It assumes that your row object class (C<result_class>) is |
2053ab2a |
57 | the same as your table class, which is the normal situation. |
19345968 |
58 | |
9b83fccd |
59 | =head1 HOOKS |
60 | |
61 | The following hooks are defined for L<Storable> - see the |
62 | documentation for L<Storable/Hooks> for detailed information on these |
63 | hooks. |
64 | |
65 | =head2 STORABLE_freeze |
66 | |
67 | The serializing hook, called on the object during serialization. It |
68 | can be inherited, or defined in the class itself, like any other |
69 | method. |
70 | |
71 | =head2 STORABLE_thaw |
72 | |
73 | The deserializing hook called on the object during deserialization. |
74 | |
19345968 |
75 | =head1 AUTHORS |
76 | |
77 | David Kamholz <dkamholz@cpan.org> |
78 | |
79 | =head1 LICENSE |
80 | |
81 | You may distribute this code under the same terms as Perl itself. |
82 | |
83 | =cut |