diff --git a/lib/gitlab/ci/config/node/undefined.rb b/lib/gitlab/ci/config/node/undefined.rb
index f152c433c42c6669d3fa78f2f1b30dbdfb24a430..7b18e3646750d747ed1245839161f63808008ef3 100644
--- a/lib/gitlab/ci/config/node/undefined.rb
+++ b/lib/gitlab/ci/config/node/undefined.rb
@@ -13,38 +13,57 @@ module Gitlab
         class Undefined < Entry
           include Validatable
 
+          delegate :valid?, :errors, :value, to: :@strategy
+
           validations do
             validates :config, type: Class
           end
 
           def initialize(node)
             super
-
-            unless node.default.nil?
-              @default = fabricate_default(node)
-            end
+            @strategy = create_strategy(node, node.default)
           end
 
-          def value
-            @default.value if @default
+          def defined?
+            false
           end
 
-          def valid?
-            @default ? @default.valid? : true
-          end
+          private
+
+          def create_strategy(node, default)
+            if default.nil?
+              Undefined::NullStrategy.new
+            else
+              entry = Node::Factory
+                .fabricate(node, default, attributes)
 
-          def errors
-            @default ? @default.errors : []
+              Undefined::DefaultStrategy.new(entry)
+            end
           end
 
-          def defined?
-            false
+          class DefaultStrategy
+            delegate :valid?, :errors, :value, to: :@default
+
+            def initialize(entry)
+              @default = entry
+            end
           end
 
-          private
+          class NullStrategy
+            def initialize(*)
+            end
 
-          def fabricate_default(node)
-            Node::Factory.fabricate(node, node.default, attributes)
+            def value
+              nil
+            end
+
+            def valid?
+              true
+            end
+
+            def errors
+              []
+            end
           end
         end
       end