Bivio::Search::Parseable
# Copyright (c) 2008-2011 bivio Software, Inc. All Rights Reserved.
# $Id$
package Bivio::Search::Parseable;
use strict;
use Bivio::Base 'Collection.Attributes';
my($_F) = b_use('IO.File');
my($_S) = b_use('Type.String');
sub as_string {
my($self) = @_;
return !ref($self) ? shift->SUPER::as_string(@_)
: (
$self->simple_package_name . '['
. $self->get_or_default(path => '')
. ','
. $self->get('content_type')
. ']'
);
}
sub get_content {
my($self) = @_;
return $self->get_if_defined_else_put(content => sub {
return $self->get('model')->get_content;
});
}
sub get_excerpt {
my($self) = @_;
return $self->get_if_defined_else_put(excerpt => sub {
return $self->get('model')->get_search_excerpt;
});
}
sub get_os_path {
my($self) = @_;
return $self->get_if_defined_else_put(os_path => sub {
my($rf, $content) = $self->unsafe_get('model', 'content');
return !$content && $rf ? $rf->get_os_path
: $_F->write($_F->temp_file($self->req), $self->get('content'));
});
}
sub get_request {
return shift->get('req');
}
sub new {
my($proto, $model_or_attr) = @_;
return $proto->SUPER::new(
Bivio::UNIVERSAL->is_blesser_of($model_or_attr) ? {
map(($_ => $model_or_attr->get($_)),
@{$model_or_attr->get_keys}),
model => $model_or_attr,
req => $model_or_attr->req,
content_type => $model_or_attr->can('get_content_type')
? $model_or_attr->get_content_type : 'text/plain',
class => $model_or_attr->simple_package_name,
} : _assert_keys($model_or_attr),
);
}
sub _assert_keys {
my($attr) = @_;
foreach my $x (
[req => qr{::Request$}],
[content_type => ''],
[class => qr{^\w+$}s],
[content => qr{^SCALAR$}],
) {
my($k, $t) = @$x;
Bivio::Die->die($k, ': not defined')
unless my $v = $attr->{$k};
Bivio::Die->die(ref($v), ': is invalid type for ', $k)
if $t && (ref($v) || $v) !~ $t;
}
$attr->{path} = ''
unless defined($attr->{path});
return $attr;
}
1;