diff --git a/lib/gitlab/ci/pipeline_duration.rb b/lib/gitlab/ci/pipeline_duration.rb
index 9fe4996fc09bb2274da5e9d26ff82993e7213c4b..0333807263fcdd80d9388a637191772a9d9f1fd1 100644
--- a/lib/gitlab/ci/pipeline_duration.rb
+++ b/lib/gitlab/ci/pipeline_duration.rb
@@ -2,7 +2,7 @@ module Gitlab
   module Ci
     # # Introduction - total running time
     #
-    # The problem this class is trying to solve is finding the total running
+    # The problem this module is trying to solve is finding the total running
     # time amongst all the jobs, excluding retries and pending (queue) time.
     # We could reduce this problem down to finding the union of periods.
     #
@@ -76,7 +76,9 @@ module Gitlab
     #     (4 - 1) + (7 - 6) => 4
     #
     # That is 4 is the answer in the example.
-    class PipelineDuration
+    module PipelineDuration
+      extend self
+
       PeriodStruct = Struct.new(:first, :last)
       class Period < PeriodStruct
         def duration
@@ -84,33 +86,27 @@ module Gitlab
         end
       end
 
-      def self.from_pipeline(pipeline)
+      def from_pipeline(pipeline)
         status = %w[success failed running canceled]
         builds = pipeline.builds.latest.where(status: status)
 
-        from_builds(builds, :started_at, :finished_at).duration
+        from_builds(builds, :started_at, :finished_at)
       end
 
-      def self.from_builds(builds, from, to, now = Time.now)
+      def from_builds(builds, from, to, now = Time.now)
         periods = builds.map do |b|
           Period.new(b.public_send(from) || now, b.public_send(to) || now)
         end
 
-        new(periods)
+        from_periods(periods)
       end
 
-      attr_reader :duration
-
-      def initialize(periods)
-        process(periods.sort_by(&:first))
+      def from_periods(periods)
+        process_duration(process_periods(periods.sort_by(&:first)))
       end
 
       private
 
-      def process(periods)
-        @duration = process_duration(process_periods(periods))
-      end
-
       def process_periods(periods)
         return periods if periods.empty?
 
diff --git a/spec/lib/gitlab/ci/pipeline_duration_spec.rb b/spec/lib/gitlab/ci/pipeline_duration_spec.rb
index a160c0a6e39fff084f5b789cb6bb414076ba5a90..580af97bea736399360f5cd9152de9ad91ea8756 100644
--- a/spec/lib/gitlab/ci/pipeline_duration_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline_duration_spec.rb
@@ -1,11 +1,11 @@
 require 'spec_helper'
 
 describe Gitlab::Ci::PipelineDuration do
-  let(:calculator) { create_calculator(data) }
+  let(:calculated_duration) { calculate(data) }
 
   shared_examples 'calculating duration' do
     it do
-      expect(calculator.duration).to eq(duration)
+      expect(calculated_duration).to eq(duration)
     end
   end
 
@@ -105,11 +105,11 @@ describe Gitlab::Ci::PipelineDuration do
     it_behaves_like 'calculating duration'
   end
 
-  def create_calculator(data)
+  def calculate(data)
     periods = data.shuffle.map do |(first, last)|
       Gitlab::Ci::PipelineDuration::Period.new(first, last)
     end
 
-    Gitlab::Ci::PipelineDuration.new(periods)
+    Gitlab::Ci::PipelineDuration.from_periods(periods)
   end
 end