=== Makefile.PL
==================================================================
--- Makefile.PL	(revision 2907)
+++ Makefile.PL	(local)
@@ -18,6 +18,7 @@
 requires('Exporter::Lite');
 requires('Lingua::EN::Inflect');
 requires('UNIVERSAL::require');
+requires('version');
 build_requires('Test::More' => 0.52);
 build_requires('DBD::SQLite');
 no_index directory => 'ex';
=== lib/Jifty/DBI/Schema.pm
==================================================================
--- lib/Jifty/DBI/Schema.pm	(revision 2907)
+++ lib/Jifty/DBI/Schema.pm	(local)
@@ -479,9 +479,11 @@
 
 =head2 till
 
-What application version this column was last supported.  Correct usage
-is C<till '0.2.5'>.
+The version after this column was supported. The column is not available in
+the version named, but would have been in the version immediately prior.
 
+Correct usage is C<till '0.2.5'>. This indicates that the column is not available in version C<0.2.5>, but was available in C<0.2.4>. The value specified for L</since> must be less than this version.
+
 =cut
 
 sub till {
=== lib/Jifty/DBI/SchemaGenerator.pm
==================================================================
--- lib/Jifty/DBI/SchemaGenerator.pm	(revision 2907)
+++ lib/Jifty/DBI/SchemaGenerator.pm	(local)
@@ -8,11 +8,12 @@
 use DBIx::DBSchema::Column;
 use DBIx::DBSchema::Table;
 use Class::ReturnValue;
+use version;
 
 our $VERSION = '0.01';
 
 # Public accessors
-__PACKAGE__->mk_accessors(qw(handle));
+__PACKAGE__->mk_accessors(qw(handle app_version));
 
 # Internal accessors: do not use from outside class
 __PACKAGE__->mk_accessors(qw(_db_schema));
@@ -128,19 +129,36 @@
 
 =head1 METHODS
 
-=head2 new HANDLE
+=head2 new HANDLE [, VERSION ]
 
-Creates a new C<Jifty::DBI::SchemaGenerator> object.  The single
-required argument is a C<Jifty::DBI::Handle>.
+Creates a new C<Jifty::DBI::SchemaGenerator> object. This takes two arguments. 
 
+=over
+
+=item HANDLE
+
+The first argument is required and must be a C<Jifty::DBI::Handle>. 
+
+=item VERSION
+
+The second argument is the application version, which is used to decide which columns should be included in the schema, based upon L<Jifty::DBI::Schema/since> and L<Jifty::DBI::Schema/till>. 
+
+If not specified, it will assume the latest version, which means that any column with a C<till> defined will not be included, but all other columns will be.
+
+The version should be given in the format used by the L<version> extension to Perl.
+
+=back
+
 =cut
 
 sub new {
-    my $class  = shift;
-    my $handle = shift;
-    my $self   = $class->SUPER::new();
+    my $class   = shift;
+    my $handle  = shift;
+    my $version = shift;
+    my $self    = $class->SUPER::new();
 
     $self->handle($handle);
+    $self->app_version(version->new($version)) if defined $version;
 
     my $schema = DBIx::DBSchema->new();
     $self->_db_schema($schema);
@@ -259,6 +277,23 @@
         next if $column->virtual;
         next if defined $column->alias_for_column;
 
+        # If app_version is defined, make sure columns are for that version
+        if (defined $self->app_version) {
+
+            # Skip it if the app version is earlier than the column version
+            next if defined $column->since 
+                and $self->app_version <  version->new($column->since);
+
+            # Skip it if the app version is the same as or later than the 
+            # column version
+            next if defined $column->till
+                and $self->app_version >= version->new($column->till);
+
+        }
+
+        # Otherwise, assume the latest version and eliminate till columns
+        next if !defined $self->app_version && defined $column->till;
+
         push @cols,
             DBIx::DBSchema::Column->new(
             {   name     => $column->name,
=== t/10schema.t
==================================================================
--- t/10schema.t	(revision 2907)
+++ t/10schema.t	(local)
@@ -3,8 +3,9 @@
 use strict;
 use warnings;
 use Test::More;
+use version;
 
-use constant TESTS_PER_DRIVER => 18;
+use constant TESTS_PER_DRIVER => 23;
 our @available_drivers;
 
 BEGIN {
@@ -91,6 +92,25 @@
                        $manually_make_text, 
                        'create_table_sql_text is the statements in create_table_sql_statements');
 
+    my $version_024_min = version->new('0.2.4');
+    my $version_024_max = version->new('0.2.8');
+
+    for my $version (qw/ 0.2.0 0.2.4 0.2.6 0.2.8 0.2.9 /) {
+
+        my $SG = Jifty::DBI::SchemaGenerator->new($handle, $version);
+        $SG->add_model('Sample::Address');
+
+        my $address_version_schema
+            = version->new($version) >= $version_024_min
+           && version->new($version) <  $version_024_max 
+                                                      ? "${address_schema}_024"
+            :                                            $address_schema;
+
+        is_ignoring_space($SG->create_table_sql_text,
+                        Sample::Address->$address_version_schema,
+                        "got the right Address schema for $d version $version");
+    }
+
     cleanup_schema( 'TestApp', $handle );
     disconnect_handle( $handle );
 }
=== t/testmodels.pl
==================================================================
--- t/testmodels.pl	(revision 2907)
+++ t/testmodels.pl	(local)
@@ -53,6 +53,11 @@
 column phone =>
   type is 'varchar';
 
+column street =>
+  type is 'varchar',
+  since '0.2.4',
+  till '0.2.8';
+
 };
 
 sub validate_name { 1 }
@@ -68,6 +73,18 @@
     }
 }
 
+sub schema_sqlite_024 {
+    return q{
+    CREATE TABLE addresses (
+     id INTEGER PRIMARY KEY NOT NULL  ,
+     employee_id integer   ,
+     name varchar  DEFAULT 'Frank' ,
+     phone varchar ,
+     street varchar
+    ) ;
+    }
+}
+
 sub schema_pg {
     return q{
     CREATE TABLE addresses ( 
@@ -80,4 +97,17 @@
     };
 }
 
+sub schema_pg_024 {
+    return q{
+    CREATE TABLE addresses ( 
+      id serial NOT NULL , 
+      employee_id integer  ,
+      name varchar DEFAULT 'Frank' ,
+      phone varchar ,
+      street varchar ,
+      PRIMARY KEY (id)
+    ) ;
+    };
+}
+
 1;
